【问题标题】:LINQ query works in LINQPad, but not in VSLINQ 查询在 LINQPad 中有效,但在 VS 中无效
【发布时间】:2021-05-16 23:19:56
【问题描述】:

我正在使用实体框架,目前在它到达最后一行时得到这个:

方法 'Single' 和 'SingleOrDefault' 只能用作 final 查询操作。考虑在此使用方法“FirstOrDefault” 而是实例。

我的查询是:

 var orderitems =
   from orderItem in db.Order_ProductItem
   join style in db.Products_Styles on orderItem.Style equals style.Index
   where orderItem.SalesOrderID == salesOrderId && 
        (orderItem.IsDeleted==null || orderItem.IsDeleted.Value == false)
   group new { orderItem, style } by orderItem.FrameNo into grp
   select new OrderItemModel
   {
       FrameNo = grp.Key,
       //Count = grp.Select(x => x.orderItem.FrameNo).Count(),
       TotalCost = grp.Sum(x => x.orderItem.CostPrice),
       OverAllWidth = grp.Single(x => x.orderItem.HardwareType == 3).orderItem.OverallWidth,
       OverAllHeight = grp.Single(x => x.orderItem.HardwareType == 3).orderItem.OverallHeight,
       Name = grp.Select(x => x.style.Name).First(),
       ImagePath = grp.Select(x => x.style.External_Image_Path).First()
   };

var orders =  orderitems.ToList();

在 LINQPad/Linq to SQL 中似乎可以正常工作......

有什么想法吗?

【问题讨论】:

  • 你试过错误信息说什么了吗?
  • 您是将 DbContext 程序集加载到 Linqpad 中,还是只是将 Linqpad 指向您的数据库以运行查询? Linqpad 默认使用 Linq-to-SQL,它不执行与实体框架相同的查询。

标签: c# linq entity-framework


【解决方案1】:

Single()First() 之间存在差异。

OverAllWidth = grp.Single(x => x.orderItem.HardwareType == 3).orderItem.OverallWidth

如果查询返回多于一个结果,这将引发异常,这是完全可能的,因为可能返回多于一个 HadwareType 3 的项目。Single() 只期望一个返回值

请改用FirstFirstOrDefault。如果返回一个以上的结果集,它将采用第一个。

【讨论】:

  • Jon Skeet 来救援?
  • 好吧,我将首先验证在 Linq to SQL 和 EF 的情况下生成了什么 SQL。也许答案会变得清晰:)
  • 我刚刚在我的 Northwind 数据库中使用产品表测试了一个分组,然后是 Name = Select(p => p.Single(boolexpresision)),我遇到了 InvalidOperationException。如果每个 Grouping 有一个结果,它会起作用,f.e. UnitPrice == 10,但如果我选择 Unitprice != null,则会引发异常。
【解决方案2】:

当 LINQpad 直接连接到数据库时,我遇到了类似的问题。如果将 LINQpad 连接到实体框架程序集而不是数据库,则 LINQpad 和 Visual Studio 的行为更接近相同。 要连接到实体框架程序集,我关注了这个页面: https://www.vitoshacademy.com/c-entity-framework-using-linqpad5-for-queries-just-getting-started/

【讨论】:

    【解决方案3】:

    您确定查询正在执行相同的数据源吗?正如其他人所指出的,如果查询返回的序列不完全包含一个元素,Single 将抛出异常。

    【讨论】:

      【解决方案4】:

      我已经这样更新了,现在它可以工作了......仍然对为什么它在 LINQPad 中很好地倾倒它感到困惑......

      var orderitems =
                         from orderItem in db.Order_ProductItem
                         join style in db.Products_Styles on orderItem.Style equals style.Index
                         where orderItem.SalesOrderID == salesOrderId && (orderItem.IsDeleted==null || orderItem.IsDeleted.Value == false)
                         group new { orderItem, style } by orderItem.FrameNo into grp
                         select new OrderItemModel
                         {
                             FrameNo = grp.Key,
                             //Count = grp.Select(x => x.orderItem.FrameNo).Count(),
                             TotalCost = grp.Sum(x => x.orderItem.CostPrice),
                             OverAllWidth = grp.FirstOrDefault(x => x.orderItem.HardwareType == 3).orderItem.OverallWidth,
                             OverAllHeight = grp.FirstOrDefault(x => x.orderItem.HardwareType == 3).orderItem.OverallHeight,
                             Name = grp.FirstOrDefault().style.Name,//.FirstOrDefault(),
                             ImagePath = grp.FirstOrDefault().style.External_Image_Path//x => x.style.External_Image_Path)//.FirstOrDefault()
                         };
                      //var count = orderitems.Count();
      
      
                      var orders =  orderitems.ToList();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-12
        • 2011-01-07
        • 1970-01-01
        • 2013-01-24
        • 2014-07-30
        • 2016-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多