您好我对实体框架中的查询有疑问
我的父项是workorders
我的子项为workorderitems
我想从workorderitems
表中选择workorder_id
列与我的varialble(myid)匹配的所有项目。结果应按项目名称分组,数量应相加。
此外,如果我删除GroupBy
和Select
语句,查询会返回结果
但是,对于GroupBy
和Select
语句,我收到错误。
以下是我的语法:
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似乎正确,有人可以告诉我吗?
答案 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/