我已经使用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中的一个错误吗?
答案 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只能单向处理它。
以上的替代解决方案:
注意:我并不是说不能用类似SQL的语法来完成。我很清楚,这个答案的大部分都是基于意见的。