Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实体框架中Linq查询中的复合“from”子句_Linq_Entity Framework - Fatal编程技术网

实体框架中Linq查询中的复合“from”子句

实体框架中Linq查询中的复合“from”子句,linq,entity-framework,Linq,Entity Framework,我已经使用实体框架工作了几个星期了。多年来,我一直在使用Linq对象和Linq SQL。很多时候,我喜欢这样写linq语句: from student in db.Students from score in student.Scores where score > 90 select student; 对于其他形式的linq,这将返回至少一个分数大于90的不同学生。但是,在EF中,该查询每超过90分返回一名学生 有人知道这种行为是否可以在单元测试中复制吗?这可能是EF中的一个bug吗?

我已经使用实体框架工作了几个星期了。多年来,我一直在使用Linq对象和Linq SQL。很多时候,我喜欢这样写linq语句:

from student in db.Students
from score in student.Scores
where score > 90
select student;
对于其他形式的linq,这将返回至少一个分数大于90的不同学生。但是,在EF中,该查询每超过90分返回一名学生


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

我不喜欢类似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中的操作非常类似,您将加入来自学生和分数的数据,然后对该集合运行筛选操作。很难再将结果分离成一个学生集合。我认为这是你的问题的主要原因。这不是一个错误,但我认为EF只能用一种方式处理它

上述问题的替代解决方案:

如果它在90分以上的分数中返回一名学生,则取返回的不同学生。它应该是相同的结果集。 使用更明确的括号和格式来嵌套单独的类似SQL的语句。
注意:我并不是说它不能用类似SQL的语法来完成。我很清楚,这个答案大部分是基于意见的。

你所说的其他形式的linq是什么意思?不是linq到实体?这被转换为linq to entities中的内部联接,因此结果似乎是准确的…请在发现此问题的地方发布一些示例数据。我的示例参考MSDN文档中给出的示例。linq的其他形式包括linq Sql和linq对象。