0

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

我的父项是workorders

我的子项目是workorderitems

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

此外,如果我删除GroupByandSelect语句,查询确实会返回结果但是使用GroupByandSelect语句我得到一个错误。

下面是我的语法:

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();

有人可以告诉我我的语法是否正确吗?

4

1 回答 1

0

您实际上不必使用单独的 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-对象-part-21-groupby/

于 2015-05-29T15:36:38.743 回答