我必须在我之前的某个应用程序中修改一些旧代码。查看下面的变量,其结果进入“测试”,我有两个表(使用关系模型设置)。在变量“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
};
答案 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.
您可以添加SelectMany然后返回符合条件的所有Shift对象的位置:
var test = entityFrameworkDateModel.Lines
.SelectMany(line => line.Shifts)
.Where(shift => shift.EndTime >= DateTime.Now);
答案 1 :(得分:0)
这两个不一样,即使他们感觉相似。对于第一个查询,不需要嵌套的“任何”过滤。只有“哪里”就足够了。任何实际上都会返回真实,这将短路的地方。我会为where子句列出正确的语法,但是我正在使用移动设备,并且在我回答时无法看到问题