【问题标题】:Linq 2 Entities bombs out with no exception depending on query construction method根据查询构造方法,Linq 2 Entities 无一例外地轰炸
【发布时间】: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


【解决方案1】:

试试这个:

var query = from s in ctx.Stuff
                select new
                {
                    Id = s.Id,
                    SearchShipment = s.Shipment
                };
if (searchType == ArrivalNo)
{
   var query2 = from s in query
   where s.Shipment.Arrivals.FirstOrDefault().ArrivalId == arrivalNo
   select s;
   query = query2;
}

【讨论】:

    猜你喜欢
    • 2011-07-16
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多