2014-06-18 43 views
1

我一直在使用Entity Framework幾個星期。多年來,我一直在使用Linq-Objects和Linq-SQL。很多時候,我喜歡寫LINQ語句是這樣的:實體框架中的Linq查詢中的複合「from」子句

from student in db.Students 
from score in student.Scores 
where score > 90 
select student; 

與其他形式的LINQ的,這將返回誰至少有一個超過90然而更大的成績不同的學生,在EF該查詢返回一個學生每個分數大於90.

有誰知道這種行爲是否可以在單元測試中複製?這可能是EF中的一個錯誤嗎?

+1

你說的'其他形式的linq'的是什麼意思? 「不是實體」?這是轉換爲LINQ內部連接到實體,所以結果似乎是準確的... –

+0

請發佈一些示例數據,你會發現這個問題。 –

+0

我的示例是指MSDN文檔[此處](http://msdn.microsoft.com/en-us/library/bb383978.aspx)中給出的示例。 Linq的其他形式包括Linq-Sql和Linq-Objects。 –

回答

0

我不喜歡那種類似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的語法來完成。我很清楚這個答案大部分是基於意見的。