2011-04-12 59 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擴展方法: