2011-11-08 55 views
0

我遇到了Linq查詢的問題,它實際上會做我需要的。我構建了一個需要在數據庫中查找文章的搜索(實體框架),搜索然後使用複選框列表來允許用戶只在某些練習領域內進行搜索。我已經看到關於linq加入&多個集合的帖子,但我的問題是,我想從中選擇的是父表項文章,我需要從實踐清單comppare我已經從複選框列表編譯的實踐。LINQ到比較集合的實體

之前,它是一個複選框列表,這是一個下拉列表,這個查詢努力尋找1和實踐:

ar = (from a in db.Articles 
     from p in a.Practices 
     where p.ID == practiceID 
     select a); 

現在,我需要在where子句像常規的SQL的「IN」的工作。我從一個複選框列表編譯的實踐集合需要與我的搜索的db.Articles.Practices進行比較。

需要任何建議或澄清?

回答

2

假設:列表practiseIds

ar = (from a in db.Articles 
    from p in db.Practices 
    where practiseIds.Contains(p.ID) 
    select a); 

但是需要一些澄清:

IN不是EF中的第一類支持的SQL方法,所以上面的代碼實際上會變成一個or列表(這可能已經在.net 4版本的EF中解決了) - http://blogs.msdn.com/b/adonet/archive/2009/08/05/improvements-to-the-generated-sql-in-net-4-0-beta1.aspx

的僞碼 -

Select * From db.Articles 
inner join db.Practices on <relation> 
Where db.Practices.practiceid = @p0 || db.Practices.practiceid = @p1 || etc.. 
+0

順便提一句,兩者都應該在SQL中生成相同的查詢計劃 – BrokenGlass

+0

兩個答案都是相同的......這是第一個,所以得到了檢查。是的,那是有效的......我是Linq的新手,非常感謝諾基亞。 – richman64

2

的ID集合中只是通過爲陣列practiceIds和使用Contains()查詢:

ar = (from a in db.Articles 
     from p in a.Practices 
     where practiceIds.Contains(p.ID) 
     select a); 
+0

這隻要兩個集合來自相同的查詢環境中工作。如果'practiceIds'在一個內存上下文中並且'db.Articles'從數據上下文中提取,它會拋出運行時異常。爲了解決這個問題,'ar'需要提取where子句併發送'ToList()'。一旦它是一個IEnumerable而不是IQueryable,那麼序列可以與'.Where(x => practiceIds.Contains(x.ID))'進行比較。 +1順便說一句:) –

+0

哈。 –

+0

@JoelEtherton:我假設它只是一個根本沒有連接到數據上下文的原語集合 - OP說他有一套從複選框編譯的IDs – BrokenGlass