Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的Lambda表达式组by_C#_Linq_Linq Group - Fatal编程技术网

C# C语言中的Lambda表达式组by

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

我想按ItemNumber对我的LINQ查询进行分组,并返回整个表以及数量合计

这是我试图分组的查询:

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