2011-06-18 38 views
4

我試圖加入一個數組的Linq到EF查詢加入數組EF查詢

在執行命令定義時發生錯誤時,遇到下列錯誤。詳情請參閱內部例外。您的SQL語句的某些部分嵌套太深。重寫查詢或將其分解爲更小的查詢。

的代碼如下:

var vids = new List<string>(); 
using (var ctx = new MyDbContext()) 
{ 
    var qry = ctx.Pickups.Where(p => p.UserName == User.Identity.Name); 
    if (someBoolean) 
    { 
     var v = GetVids(); // get the list of Ids from a web service 
     vids.AddRange(v); 
    } 
    if (vids.Count() > 0) 
    { 
     qry = qry.Join(vids, p => p.VId, v => v, (v, p) => p); 
    } 
    var data = qry 
     .Select(p => new 
     { 
      // etc. 
     }); 
} 

的問題是,Web服務是不是與我使用EF與DB相關的,否則,我只是做了加入反對數據庫中的表格。我從Web服務中獲得的Id的數量可能會超過一百個(通常爲5-10)。如果我註釋Join,代碼工作正常,所以我知道錯誤在Join中。在vids中只有少數(最多約30個)ID,連接完美無缺。

你有什麼建議來解決這個問題?我唯一能想到的就是將ID列表插入到數據庫中,並以這種方式進行連接。這對我來說似乎不太吸引人。

+0

我認爲問題不在於你提供的代碼部分 –

回答

5

嘗試用替換if (vids.Count() > 0)

if (vids.Count > 0) 
{ 
    qry = qry.Where(arg => vids.Contains(arg.VId)); 
} 

這將工作僅當vids是不到2100元,因爲這將被轉換爲IN (x, y, .., n)條件。

如果使用實體框架3.5,那麼Contains將不起作用。你可以在這裏找到可能的解決方案:'Contains()' workaround using Linq to Entities?

+0

我使用EF 4.0,所以我沒事。將聯接更改爲您描述的位置,並且效果很好。將永遠不會超過幾百,所以這應該工作。啊,處理兩個不同系統的樂趣,並且必須自己成爲聚合器。 –