【问题标题】:GroupBy / Sum query issue with Entity Framework实体框架的 GroupBy / Sum 查询问题
【发布时间】:2012-05-14 17:52:12
【问题描述】:

您好,我对实体框架中的查询有疑问

我的父项是workorders

我的子项是workorderitems

我想从workorderitems 表中选择workorder_id 列与我的变量(myid)匹配的所有项目。结果应按项目名称分组,数量应相加。

此外,如果我删除 GroupBySelect 语句,查询会返回结果 但是,使用 GroupBySelect 语句时出现错误。

下面是我的语法:

var workorderitems= DBContext.WorkOrderItems
.Where(o => o.workorder_id == myid)
.GroupBy(grp => new { grp.ItemName })
.Select(result => new { itemname = result.Key.ItemName, qty = result.Sum(o => o.ItemQuantity) });



   var mycount = workorderitems.Count();

如果我的语法看起来正确,有人可以告诉我吗?

【问题讨论】:

  • 对象引用未设置为对象的实例。我认为这意味着查询没有返回值?
  • 这意味着它在返回任何值之前就崩溃了。
  • 所以我使用的数据库提供程序不支持 GroupBy 或 Sum。有没有办法解决这个问题?
  • 您可以尝试在 where 子句之后添加 ToList()。然后 groupby 和 select 将由 C# 而不是您的数据库提供程序处理。
  • 美丽这就像一个魅力。我分两步完成。首先只执行 .where 和 tolist。然后把这个结果和我们分组并求和

标签: c# entity-framework entity-framework-4 linq-to-entities


【解决方案1】:

您实际上不必使用单独的 Select,通过使用 GroupBy 方法的重载之一,您可以使用 'keySelector' 和 'resultSelector' 参数来组合 group 和 sum。

GroupBy 是一种非常强大的方法,一开始可能会让人望而生畏,但一旦你掌握了它,它就相当简单并且用途广泛。

这是一个示例,它创建一个 WorkOrderItems 列表,每个组一个,结果汇总在其中;而不是返回一个匿名对象列表。您可以使用多个键选择器(按子句分组)对其进行扩展,并对结果对象进行各种求和和操作...

class Program
{
    static void Main(string[] args)
    {
        var myItems = new List<WorkOrderItem>
        {
            new WorkOrderItem { OrderId = 1, ItemName = "A", ItemQuantity = 0 },
            new WorkOrderItem { OrderId = 0, ItemName = "A", ItemQuantity = 1 },
            new WorkOrderItem { OrderId = 0, ItemName = "A", ItemQuantity = 2 },
            new WorkOrderItem { OrderId = 0, ItemName = "B", ItemQuantity = 3 },
            new WorkOrderItem { OrderId = 0, ItemName = "B", ItemQuantity = 4 },
            new WorkOrderItem { OrderId = 1, ItemName = "B", ItemQuantity = 5 },
            new WorkOrderItem { OrderId = 0, ItemName = "C", ItemQuantity = 6 },
        };

        int myId = 0;

        List<WorkOrderItem> groupedItems =
            myItems.Where(i => i.OrderId == myId)
                    .GroupBy(
                        //key selector
                        i => i.ItemName,
                        //result selector
                        (name, items) =>
                        {
                            var aggregatedItem = new WorkOrderItem
                            {
                                OrderId = myId,
                                ItemName = name,
                                ItemQuantity = items.Sum(i => i.ItemQuantity)
                            };
                            return aggregatedItem;
                        })
                        .ToList();


    }

    class WorkOrderItem
    {
        public int OrderId { get; set; }
        public string ItemName { get; set; }
        public int ItemQuantity { get; set; }
    }
}

要进一步阅读 Linq 中最被低估的方法之一,我强烈建议您查看 Jon Skeet 的这篇博文: http://codeblog.jonskeet.uk/2011/01/01/reimplementing-linq-to-objects-part-21-groupby/

【讨论】:

    猜你喜欢
    • 2012-01-25
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多