化合物"来自"实体框架中Linq查询中的子句

时间:2014-06-18 12:31:24

标签: linq entity-framework

我已经使用Entity Framework几周了。多年来我一直在使用Linq-Objects和Linq-SQL。很多时候,我喜欢写这样的linq语句:

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

使用其他形式的linq,这将返回至少有一个分数大于90的不同学生。但是,在EF中,此查询会为每个大于90的分数返回一个学生。

是否有人知道在单元测试中是否可以复制此行为?这可能是EF中的一个错误吗?

1 个答案:

答案 0 :(得分: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中所做的那样,您正在加入来自学生和分数的数据,然后对该集合运行过滤操作。然后,将这种结果再次分离成一组学生变得更加困难。我认为这是您问题的主要原因。这不是 bug persé,但我认为EF只能单向处理它。

以上的替代解决方案:

  • 如果每个分数超过90,则返回一名学生,并返回不同学生。它应该是相同的结果集。
  • 使用更明确的括号()和格式来嵌套单独的类似SQL的语句。

注意:我并不是说不能用类似SQL的语法来完成。我很清楚,这个答案的大部分都是基于意见的。