2009-08-31 75 views

回答

5
var q = from a in Context.Activities 
     where a.Keywords.Any(k => k.Keyword == someKeyword) 
     select a; 

正如我在評論中說,它幾乎總是錯誤的使用LINQ加盟實體。應該使用關係屬性來代替。

+0

這是爲什麼?你有這個信息的來源嗎? – 2009-09-01 13:41:18

+0

因爲關係屬性是專門爲此目的而設計的。寫出一個連接就是複製你已經在(1)數據庫元數據和(2)你的實體模型中表達的代碼。每次編寫查詢時,你是否真的想重新發明這個(有時會有可能發生的錯誤)? – 2009-09-01 13:44:49

+0

克雷格,感謝您的信息,我只開始學習EF,所以不太清楚什麼是最好的方法等。 – James 2009-09-01 14:08:06

1

結賬答案由Craig斯頓茨更清潔的方式,如果你有一個關係定義

我以前的回答是錯誤的,但這個對我的作品。

var activities = from a in db.Activities 
       join ak in db.ActivityKeywords on a.ID equals ak.ActivityID 
       where ak.Keyword == "yourkeyword" 
       select a; 
+0

這不會編譯,你試圖在兩個表中使用一個。 – James 2009-08-31 20:23:52

+0

是的,看起來更符合我心中的想法!我會試一試 – James 2009-08-31 21:18:11

+0

在LINQ to Entities中使用連接幾乎總是錯誤的。應該使用關係屬性來代替。 – 2009-09-01 13:35:37

0

我認爲你需要像

Give me all Activities which ID are in a list of ActivitiyKeywords.ID's 

如果這是你的問題,你可以試試這個:

var ids = from k in db.ActivityKeywords select k.ActivityID; 

var result = from a in db.Activities where ids.Contains(a.ID) select a; 

更多信息here

+0

所以唯一的選擇是做2個查詢?我以爲我可以使用連接或什麼? – James 2009-08-31 20:19:33

+0

不要把這看成2個查詢。請記住,編譯器會優化這一點,因此它只會產生一個帶有IN sql子句的查詢。 – eKek0 2009-08-31 22:56:47

+0

LINQ to Entities不支持包含(在.NET 3.5 SP1中,無論如何;我認爲它在.NET 4中受支持)。 http://msdn.microsoft.com/en-us/library/bb738638.aspx一般情況下,請使用Any()。 – 2009-09-01 13:59:58

0
var results = (from a in Activities 
       from k in ActivityKeywords 
       where k.Keyword == "keyword" && k.ActivityID == a.ID 
       select a).Distinct(); 
+0

我測試了這個,它工作正常!然而,這比使用連接更有效率嗎? – James 2009-09-01 07:31:22

+0

我不知道。你可以通過使用 ((ObjectQuery )results)來檢查生成的SQL。ToTraceString() – Botz3000 2009-09-01 08:13:13

+0

我不知道高效,但它肯定是過於複雜和難以閱讀的。 – 2009-09-01 13:36:54