2012-04-16 102 views
8

還有其他一些類似的問題,但他們都沒有做我想做的事情。我想在字符串和查詢LINQ風味IS IN查詢

SELECT ownerid where sysid in ('', '', '') -- i.e. List<string> 

或類似

var chiLst = new List<string>(); 
var parRec = Lnq.attlnks.Where(a => a.sysid IN chiList).Select(a => a.ownerid); 

我一直在a.sysid.Contains玩弄(),但名單通一直沒能得到任何地方。

+1

+1如果你認爲應該有你的問題的第一個答案Jon Skeet Badge lol – 2012-04-16 18:28:08

回答

11

Contains是前進的方向:

var chiLst = new List<string>(); 
var parRec = Lnq.attlnks.Where(a => chiList.Contains(a.sysid)) 
         .Select(a => a.ownerid); 

雖然你會用HashSet<string>,而不是一個列表,在性能方面更好,因爲所有的包含檢查。 (假設將會有相當多的條目...對於少量值,這兩種方式都不會有太大的差別,並且List<string>甚至可能會更快。)

請注意,性能方面假設你正在使用LINQ to Objects - 如果你使用的是LINQ to SQL之類的東西,那麼不會有問題,因爲Contains檢查不會在進程中完成。

+0

+1。在一分鐘內5票,祝賀:) – mellamokb 2012-04-16 18:23:32

+3

對於像Linq to SQL這樣的東西,HashSet不會有任何區別,因爲它只是取得列表中的所有元素並生成IN子句。 – RobSiklos 2012-04-16 18:25:27

+0

@Jon Skeet Jon使用HashSet有什麼區別? – 2012-04-16 18:26:29

1

你不會打電話給a.sysid.Contains;爲IN(SQL)語法的語法爲Contains(LINQ)反向

var parRec = Lnq.attlnks.Where(a => chiList.Contains(a.sysid)) 
         .Select(a => a.ownerid); 
1

除了Contains的方法,你可以join

var parRec = from a in Lnq.attlnks 
      join sysid in chiLst 
       on a.sysid equals sysid 
      select a.ownerid 

我不知道這是否將會比使用HashSet的Contains做得更好,但它至少會有類似的性能。它肯定會比使用Contains更好。

+0

假設LINQ到對象,它基本上會在連接實現中構建一個'HashSet '。 (如果列表增長很大,它將比'List '更快* - 如果列表非常短,那麼基於散列的實現可能會比較慢,因爲它需要首先生成目標的散列。真的是各種各樣的變數。) – 2012-04-16 18:31:32