2个具有不同语法的类似LINQ语句产生不同的输出

2个具有不同语法的类似LINQ语句产生不同的输出,linq,Linq,我必须修改我之前的人制作的应用程序中的一些旧代码。查看下面的变量,其结果进入“test”,我有两个表(使用关系模型设置)。在变量“test2”中,我用更多的SQL语法重写了查询(我已经习惯了)。我想加入LineId匹配的Lines and Shift表。当我查看“test2”输出时,我得到6个值,其中结束时间为2-28-2017 8:30,9:30。。。一点半和二点半。这是有道理的。当我查看“test”输出时,我看到一行有大约500个与之相关联的移位条目。检查这些要素会产生可追溯到2017年的结

我必须修改我之前的人制作的应用程序中的一些旧代码。查看下面的变量,其结果进入“test”,我有两个表(使用关系模型设置)。在变量“test2”中,我用更多的SQL语法重写了查询(我已经习惯了)。我想加入LineId匹配的Lines and Shift表。当我查看“test2”输出时,我得到6个值,其中结束时间为2-28-2017 8:30,9:30。。。一点半和二点半。这是有道理的。当我查看“test”输出时,我看到一行有大约500个与之相关联的移位条目。检查这些要素会产生可追溯到2017年的结束时间。我是否应该在“test”输出中得到与我在“test2”输出中得到的相同的6个条目?linq在“测试”输出中所做的不同之处是否有我在幕后遗漏的东西?任何帮助都将不胜感激

var test = entityFrameworkDateModel.Lines.Where(line => line.Shifts.Any(s => shift.EndTime >= DateTime.Now));
var test2 = from line in entityFrameworkDateModel.Lines
            join shift in entityFrameworkDateModel.Shifts on line.LineID equals shift.LineId
            where shift.EndTime >= DateTime.Now
            select new
            {
                line.LineID,
                shift.EndTime
            };

测试是具有0到多个Shift对象的线条对象的集合。我希望如此

test.SelectMany(t => t.Shifts).Count() == 500 // approx. 500 anyways
test2是匿名对象的集合。test2使用每个LineId/Shift结束时间对一个对象展平数据。其中as测试将数据保存在层次结构中

检查这些要素会产生可追溯到2017年的结束时间

测试可以并且将包含不符合where标准的班次。因为您只返回具有结束时间大于现在的偏移的线对象。因此,Line对象将有一个或多个移位匹配
EndTime>=DateTime.Now
。但是
.Any()
不会过滤掉
EndTime


您可以添加SelectMany,然后在何处返回符合条件的所有Shift对象:

var test = entityFrameworkDateModel.Lines
    .SelectMany(line => line.Shifts)
    .Where(shift => shift.EndTime >= DateTime.Now);

这两个人不一样,尽管他们感觉相似。对于第一个查询,不需要嵌套的“any”筛选。光是“where”就足够了。any实际上将返回true,这将使where短路。我会为where子句列出正确的语法,但我在手机上,所以在回答时看不到问题

谢谢,这很有意义。但是,我不能用.Where()替换.Any()以过滤掉Shift对象。我可以在第二个查询语句中对“test”的结果执行.Where()子句,方法是:var filterValues=test.SelectMany(t=>t.shift.Where(nestedT=>nestedT.EndTime>=DateTime.Now));是否有一种语法方法可以将第二个where子句组合到原始查询中?(我觉得好像有,但是这种linq语法对我来说更难生成,而linq的SQL语法更容易生成。)谢谢,这是非常清楚的。选择您加入的所有班次,然后从SelectMany子句中筛选您的班次时间。