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

时间:2018-02-28 13:58:50

标签: linq

我必须在我之前的某个应用程序中修改一些旧代码。查看下面的变量,其结果进入“测试”,我有两个表(使用关系模型设置)。在变量“test2”中,我用更多的SQL语法(我习惯了)重写了查询。我想加入LineId匹配的Lines and Shifts表。当我查看“test2”输出时,我得到6个值,结束时间是2-28-2017 8:30,9:30~1:30和2:30。那讲得通。当我查看“测试”输出时,我看到一行有大约500个与其关联的Shift项。检查这些元素会产生可追溯到2017年的结束时间。我是否应该在“test2”输出中返回的“test”输出中获得相同的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
            };

2 个答案:

答案 0 :(得分:1)

test是具有0到多个Shift对象的Line对象的集合。我希望那个

test.SelectMany(t => t.Shifts).Count() == 500 // approx. 500 anyways

test2是AnonymousObjects的集合。 test2使每个LineId / Shift End Time对中的一个对象展平您的数据。测试将数据保持在层次结构中的位置。

  

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

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

中的其他Shift对象

您可以添加SelectMany然后返回符合条件的所有Shift对象的位置:

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

答案 1 :(得分:0)

这两个不一样,即使他们感觉相似。对于第一个查询,不需要嵌套的“任何”过滤。只有“哪里”就足够了。任何实际上都会返回真实,这将短路的地方。我会为where子句列出正确的语法,但是我正在使用移动设备,并且在我回答时无法看到问题