2010-11-04 41 views
0

我想從一個不在另一個容器中的容器獲取項目。一個容器是IEnumerable,另一個容器是DB中的實體。例如Linq2sql優化左連接獲取僅存在於一個容器中的項目

IEnumberable<int> ids = new List<int>(); 
ids.Add(1); 
ids.Add(2); 
ids.Add(3); 
using (MyObjectContext ctx = new MyObjectContext()) 
{ 
    var filtered_ids = ids.Except(from u in ctx.Users select u.id); 
} 

這種方法的工作原理,但我意識到潛在的SQL是類似SELECT id FROM [Users]。這不是我想要的。它更改爲

var filtered_ids = ids.Except(from u in ctx.Users 
        where ids.Contains(u.id) 
        select u.id); 

改善基礎查詢,並增加了WHERE [id] IN (...)這似乎是一個更好的方式。

我有2個問題:

  1. 是否有可能進一步提高性能,此查詢?

  2. 據我記得,在IN有多少參數可以限制。如果我超過限制(這不太可能發生,但最好是準備),我的當前查詢是否可以工作?

回答

1
  1. 該查詢應該罰款,提供了適當的索引/主鍵到位。

  2. SQL服務器接受的sql參數的上限大約爲2100.如果超出限制,將會遇到sql異常而不是結果。

+0

感謝您的回答 – a1ex07 2010-11-04 19:52:19