【发布时间】:2017-09-07 09:42:20
【问题描述】:
如果我运行此查询(单独构建)
// To make the SearchShipment Shipment 'entity' load eagerly
ctx.ContextOptions.LazyLoadingEnabled = false;
var query = from s in ctx.Stuff
select new
{
Id = s.Id,
SearchShipment = s.Shipment
};
if (searchType == ArrivalNo)
{
query = query.Where(x => x.SearchShipment.Arrivals.FirstOrDefault().ArrivalId == arrivalNo);
}
当我尝试 query.ToList() 时,它只是爆炸(没有到达方法的返回语句),没有消息或异常(应用程序仍在运行),但在 VS2010 中调试时将焦点返回给浏览器调用方法不显示/返回任何结果。
但如果我在一个语句中构造查询,它可以正常工作并返回我所期望的 941 个结果。
var query = from s in ctx.Stuff
where s.Shipment.Arrivals.FirstOrDefault().ArrivalId == arrivalNo
select new
{
Id = s.Id,
SearchShipment = s.Shipment
};
现在,如果我执行 query.ToList() 它可以正常工作吗?
任何想法为什么?把我难住了!我知道左外连接在 LINQ 中有点棘手,但这只是简单的愚蠢行为!
编辑:我将把“解决方案”放在这里,这样它就可以抓住其他来这里寻找解决方案的人:
我没有向自己声明的部分查询是因为我认为它无关紧要:
Dmg = from d in s.Damages
select d.DamageType.Description + " [" + d.DamageCode.Trim() + "]"
实际上是这段代码使它工作或不工作取决于它的构造方式?!?!?!?!?!? (此代码始终存在,并以一种方式引起问题,但不是另一种?!?!?!?!?)
它抛出了一个我只在 LINQPad 中运行查询时才发现的静默错误(它突出显示了上述子查询的 d 部分)
对象引用未设置为对象的实例。
但是,通过将其更改为使用显式连接,查询现在可以很好地与部分构造方法一起使用:
Dmg = from d in s.Damages
join dc in ctx.DamageTypes on d.DamageCode equals dc.Code
select d != null ? dc.Description + " [" + dc.Code.Trim() + "]" : string.Empty
正如歌曲所言,《How Bizarre, How Bizarre》。
附:也许这里有一些逻辑,考虑到项目时间限制,我无法理解我不知道。
【问题讨论】:
-
由于 L2E 查询翻译(和错误)存在很多差异,您使用的是哪个 EF 或 EFC 版本?
-
您使用了两次变量查询,并且对象类型不一样导致异常。
-
@IvanStoev 版本 v4.0.30319
-
@jdweng 谢谢,但我不认为是这种情况,这是一种经常使用的部分构造查询的方法......例如query = query.Where(x => x.CallOffNo == callOffNo);工作正常
-
@IvanStoev 是的,卡在 4 上,你不必告诉我!我梦想 VS2010 升级到 VS2017,EF4 升级到 EF6! :D
标签: c# entity-framework linq linq-to-entities