我不喜歡那種類似SQL的語法(我沒有更好的名字),特別是當你開始嵌套它們時。
var students = db.Students.Where(student
=> student.Scores.Any(score => score > 90)
)
.ToList();
這個片段中,使用方法的語法,做同樣的事情。我發現它更具可讀性。它在所使用的操作順序中更加明確。
據我所知,EF尚未顯示使用方法語法進行選擇的錯誤。
編輯
要真正回答你的問題:
However, in EF this query returns one student for every score greater than 90.
我認爲是是由於將要運行最終的SQL使用JOIN語句。這就是爲什麼我避免使用類似於SQL的語法的原因,因爲很難區分檢索(學生)和((分數))的篩選器。
就像您在SQL中所做的一樣,您將加入來自學生和分數的數據,然後對該集合運行過濾操作。然後再將這個結果再分成一組學生變得更加困難。我認爲這是你問題的主要原因。這不是一個錯誤每個SE,但我認爲EF只能處理它的一種方式。
上述替代方案:
- 如果返回每一個得分超過學生90,取不同學生返回。它應該是相同的結果集。
- 使用更多的顯式括號()和格式來嵌套單獨的類似SQL的語句。
注意:我並不是說它不能用類似SQL的語法來完成。我很清楚這個答案大部分是基於意見的。
你說的'其他形式的linq'的是什麼意思? 「不是實體」?這是轉換爲LINQ內部連接到實體,所以結果似乎是準確的... –
請發佈一些示例數據,你會發現這個問題。 –
我的示例是指MSDN文檔[此處](http://msdn.microsoft.com/en-us/library/bb383978.aspx)中給出的示例。 Linq的其他形式包括Linq-Sql和Linq-Objects。 –