2011-04-12 77 views
0

LINQ到SQL业务层调用SQL存储过程,并得到:无效转换的LINQ到SQL

Unable to cast object of type 'WhereSelectEnumerableIterator`2 
[ERICustomersDataLayer.MergeCustomersResult,ERICustomersDataLayer.MergeCustomersResult]' 
to type 'System.Collections.Generic.List`1[System.String]'. 

存储过程:

ALTER PROCEDURE MergeCustomers @CurrentCustomerId UNIQUEIDENTIFIER, @MergedCustomerId UNIQUEIDENTIFIER 
AS 
BEGIN 
    DECLARE @Error VARCHAR(500); 
    IF NOT EXISTS (SELECT * FROM Customer WHERE Id = @CurrentCustomerId) 
    BEGIN 
     SET @Error = 'Current customer ID not in customer table ' 
     SELECT @Error [Error] 
     RETURN -1 
    END 

    IF NOT EXISTS (SELECT * FROM Customer WHERE Id = @MergedCustomerId) 
    BEGIN 
     SET @Error = 'Merged customer ID not in customer table ' 
     SELECT @Error [Error] 
     RETURN -1 
    END 
END 

的LINQ TO- SQL代码:

public List<string> Merge(Guid CurrentUserId, Guid MergedUserId) 
{ 
    var dc = new ERICustomersDataLayer.ERICustomersDataContext(); 
    var rows = (
      from e in dc.MergeCustomers(CurrentUserId, MergedUserId) 
      select e); 

    return (List<string>)rows; 
} 

在测试案例中,SP没有返回任何东西,所以这应该与空查询相同。但是,即使它返回错误消息,我也会得到相同的异常。

+0

你的存储过程实际上选择了什么?它似乎只检查客户的存在两次,但在两个实际存在的情况下,没有发生任何事情...... – 2011-04-12 20:55:32

回答

1

正如driis所说,LINQ没有返回一个列表,但MergeCustomersResult的IEnumerable。所以你不能把它转换成List或简单地做.ToList()。你需要确保你的var“rows”是一个字符串列表,然后才能将它作为一个返回。尝试是这样的:

public List<string> Merge(Guid CurrentUserId, Guid MergedUserId) { 
    var dc = new ERICustomersDataLayer.ERICustomersDataContext(); 
    var rows = (from e in dc.MergeCustomers(CurrentUserId, MergedUserId)    
       select e.Error);  
    return rows.ToList(); 
} 

我不知道你怎么MergeCustomerResult是设置,但我猜它有一个属性叫做错误映射到[错误]列在您的SP被返回。

+0

当我现在看到它时非常明显。我试图投射整行(e)而不是单列[错误]。 Thans @TKTS – 2011-04-13 18:59:19

1

您的错误只是说它不能将结果转换为列表。这是有道理的,因为LINQ查询没有返回一个List,而是一个IQueryable(或IEnumerable),其实现基于实际表达式和底层提供者。

您可以轻松修复此错误。尝试将其转换为一个列表,而不是使用ToList扩展方法: