实体框架的GroupBy / Sum查询问题

时间:2012-05-14 17:52:13

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

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

我的父项是workorders

我的子项为workorderitems

我想从workorderitems表中选择workorder_id列与我的varialble(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();

如果我的synatax似乎正确,有人可以告诉我吗?

1 个答案:

答案 0 :(得分:0)

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

GroupBy是一个非常强大的方法,一开始可能会非常令人生畏,但是一旦你了解它就会非常直接且非常通用。

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

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/