C# C语言中的Lambda表达式组by
我想按ItemNumber对我的LINQ查询进行分组,并返回整个表以及数量合计 这是我试图分组的查询:C# C语言中的Lambda表达式组by,c#,linq,linq-group,C#,Linq,Linq Group,我想按ItemNumber对我的LINQ查询进行分组,并返回整个表以及数量合计 这是我试图分组的查询: public IQueryable<WebsiteOrderStatus> GetOrderStatusByAccountNumberWithoutDeleted (string accountNumber) { return db.WebsiteOrderStatus .Where(x => x.AccountNumber
public IQueryable<WebsiteOrderStatus> GetOrderStatusByAccountNumberWithoutDeleted
(string accountNumber)
{
return db.WebsiteOrderStatus
.Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1);
}
我认为选择应该是:
.Select(g => new
{
ItemNumber = g.Key,
Column1 = (Int32?)g.Sum(p => p.Quantity)
});
请注意匿名类型第一行中的更改。分组的关键已经是项目编号了。我看到的关于您的查询的唯一问题是 根据注释缺少返回语句 select语句应为: - 编辑:如果您想在结果对象中获取ItemNumber和ItemName,您还必须对这些字段进行分组
db.WebsiteOrderStatus
.Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1)
.GroupBy(g => new { g.ItemNumber, g.ItemName })
.Select(g => new
{
ItemNumber = g.Key.ItemNumber,
ItemName = g.Key.ItemName,
Count = g.Sum(item => item.Quantity)
});
不能对返回值类型使用匿名类型。所以你永远不会编译代码 此外,linq表达式具有IQueryable<[anonymous type]>结果类型 我相信你可以这样做: 公共IQueryable字符串accountNumber { db.WebsiteOrderStatus .Whereorder=>order.AccountNumber==AccountNumber&&order.LastUpdatedStatus!=1 .GroupByorder=>order.ItemNumber .Selectgrouping=>new OrderStatus//这是您的自定义类,仅用于绑定 { ItemNumber=grouping.Key, ItemName=grouping.First.ItemName, 数量=分组。Sumorder=>order.Quantity }; }
我也修正了我的答案:不确定还有什么错误,但至少在第二个示例中,您缺少了一个返回值。您得到的编译错误是什么?可能他试图将g.Key视为一个对象,而它只是int。如果他想要结果中的项名称,那么他还必须将其存储在key对象中,并使key成为一个可比较的对象,或者从组枚举器的第一个条目读取。我猜,它似乎只返回ItemNumber和Total。我想要的是整个表,只包含一个名为total的列,其中包含QuantityOk的总计,所以我想要在结果中得到的每个对象都必须在分组中。实际上,表中还有5个其他字段,除了我需要包含在groupby中的所有字段之外,还有没有更好的方法进行分组?@KLIM8D-不,根据定义,在组的输出中需要的每个字段(未聚合即求和)都必须包含在groupby中。警告:您可以使用另一个建议。首先,我不建议您使用它,您每次都要枚举列表。为什么不能使用匿名类型作为返回值。如何在方法的签名中指定它?MSDN:您不能将字段、属性、事件或方法的返回类型声明为具有匿名类型。同样,不能将方法、属性、构造函数或索引器的形式参数声明为具有匿名类型。要将匿名类型或包含匿名类型的集合作为参数传递给方法,可以将参数声明为type object。然而,这样做违背了强类型的目的。如果必须存储查询结果或将它们传递到方法边界之外,请考虑使用普通的命名结构或类,而不是匿名类型。谢谢,我以前还没有使用自定义类。如果我发现我的解决方案“编辑”主题的性能很慢,并且有时间,我会尝试尝试一下:我们几乎做到了——在我尝试将查询绑定到gridview之前,不会出现任何错误。我收到此异常:System.NotSupportedException:不允许在查询中显式构造实体类型“GWportal.BusinessLayer.Repository.WebsiteOrderStatus”。实体可以在查询之外创建,并使用DataContext插入到数据存储中。然后可以使用查询检索它们。但是,不能在查询中创建实体。在这种情况下,您必须为绑定创建一个自定义类,并将“WebsiteOrderStatus”映射到该类的对象。
public IQueryable<WebsiteOrderStatus> GetOrderStatusByAccountNumberWithoutDeleted(string accountNumber)
{
return db.WebsiteOrderStatus.Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1).GroupBy(x => x.ItemNumber).Select(grp => grp.First());
}
public int GetQuantityOfUsersItem(string accountNumber, string itemNumber)
{
return db.WebsiteOrderStatus.Where(x => x.ItemNumber == itemNumber && x.AccountNumber == accountNumber).Sum(x => x.Quantity);
}
var query = websiteOrderStatusRep.GetOrderStatusByAccountNumberWithoutDeleted(AppSession.CurrentLoginTicket.AccountNumber).Select(x => new { x.ItemName, x.ItemNumber, x.FormatName, x.Price, x.Status, x.Levering, Quantity = websiteOrderStatusRep.GetQuantityOfUsersItem(x.AccountNumber, x.ItemNumber)});
public IQueryable<IGrouping<Int32?, WebsiteOrderStatus>> lol(string accountNumber)
{
db.WebsiteOrderStatus
.Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1)
.GroupBy(g => g.ItemNumber)
.Select(g => new
{
ItemNumber = g.Key,
ItemName = g.First().ItemName,
Count = g.Sum(item => item.Quantity)
});
}
.Select(g => new
{
ItemNumber = g.Key,
Column1 = (Int32?)g.Sum(p => p.Quantity)
});
.Select(g => new {
ItemNumber = g.Key,
Total = g.Sum(p => p.Quantity)
});
db.WebsiteOrderStatus
.Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1)
.GroupBy(g => new { g.ItemNumber, g.ItemName })
.Select(g => new
{
ItemNumber = g.Key.ItemNumber,
ItemName = g.Key.ItemName,
Count = g.Sum(item => item.Quantity)
});
public IQueryable<OrderStatus > lol(string accountNumber)
{
return db.WebsiteOrderStatus
.Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1)
.GroupBy(g => g.ItemNumber)
.Select(g =>
new OrderStatus //This is your custom class, for binding only
{
ItemNumber = g.Key,
ItemName = g.First().ItemName,
Quantity = g.Sum(g => g.Quantity)
}
);
}