2012-03-23 226 views
3

我有下面的類和對象LINQ查詢扔嵌套太深例外

Product{int ProdId{get; set;}, string ProdDesc{get; set;}} 

IQueryable<Product> products = ProductRepository.GetAllProducts(); 

List<int> filteredProdIds = new List<int>(); 

GetAllProducts()方法執行一對夫婦的加入了一些EF類並給回IQueryable<Product>對象。我已經測試過它是否回饋了預期值,並且它已經做到了。

products我想所有有他們ProdIdfilteredProdIds(假設filteredProdIds已經充滿了Ids)中的記錄:

products = products.Where(p => filteredProdIds.Any(fp => fp.Equals(p.ProdId))); 

WHN我啓動我的應用程序,它拋出一個異常

您的SQL語句的某些部分嵌套太深。重寫查詢或將其分解爲更小的查詢。

我試圖與LINQPad來驗證該查詢,通過用等效數據庫視圖更換GetAllProducts()方法,以及它的工作原理。

這種異常的原因是什麼?

UPDATE

filteredProductIds通過這種方法填充:

IEnumerable<int> filteredProductIds = products.Select(p => p.partId).Distinct().ToList(); 

我找到了一種方法來避免這種例外,但必須有一個更清潔的解決方案:

foreach (var filteredProdId in filteredProdIds) 
{ 
    product.Union(product.Where(p => p.ProdId.Equals(filteredProdId))); 
} 
product.Distinct(); 
+2

這也許可以澄清這個問題:http://blog.hompus.nl/2010/08/26/joining-an-iqueryable- with-an-enumerable/ – ilmatte 2012-07-05 07:30:12

回答

1

有是filteredProdIds內有多少項目的限制,因爲它是一個列表。

要測試你可以設置filteredProdIds到:

filteredProdIds = filteredProdIds.Take(1).ToList(); 
+0

你是什麼意思?通常,當你使用數組時,通常你在項目上指定一個邊界,而List的分配是動態的,因此理論上沒有上限 – CiccioMiami 2012-03-23 12:27:17

+0

@CiccioMiami - 如果你使用* linq-to-objects *,你會好的,但由於您正在使用linq-ent-entite,所以列表的大小有限制。要測試嘗試設置:* filteredProdIds = filteredProdIds.Take(1).ToList(); * – Aducci 2012-03-23 12:35:16

+0

抱歉,但我不明白你的觀點。當filteredProdIds填充數據並將其正確填充時,我會放置一個手錶。 – CiccioMiami 2012-03-23 13:01:05

1
var filteredProdIds = FilterIds().ToArray(); 
var products = ProductRepository.GetAllProducts().Where(p => filteredProdIds.Contains(p.ProdId)); 
+0

爲什麼你直接使用Contains直接在filteredProdIds上?你正在比較int []和int,它會給出一個運行時錯誤。此外,對於包含ProdId = 2的Contains,則表達式將對包含2的所有filteredProdId值(例如12,20,21,22等)返回true。 – CiccioMiami 2012-03-23 12:36:10

+2

你試過@CiccioMiami嗎?它應該翻譯成'WHERE ProductId IN(1,2,3,...','IN'包含整數,所以2不會匹配12。 – 2012-03-24 10:53:03