【问题标题】:Group by clause not allowing grouping on class levelGroup by 子句不允许在类级别上分组
【发布时间】:2019-08-18 12:12:16
【问题描述】:

我有以下类,但我想在 LINQ 组表达式中使用它,但我遇到了错误。

namespace importService.Model
{
 [DelimitedRecord(",")]
 [IgnoreEmptyLines()]
 public class Import
 {
    public int ID { get; set; }
    public string ProductType { get; set; }
    public Single? Weight { get; set; }
    public string ProductName { get; set; }
    public string NominalCode { get; set; }
    public decimal Costings { get; set; }
    public DateTime DateTimeCreated { get; set; }
    public string ImportedBy { get; set; }
    public string OrderUser { get; set; }
    public bool isActive { get; set; }
    public int Status { get; set; }
    public long OrderNo { get; set; }
 }
}

我正在尝试使用它在电子邮件中很好地分组

List<Import> orders = new List<Import> 
orders=Filled in from select statment from dapper
orders = orders.GroupBy(g => g.OrderNo).ToList();

但是,我收到以下错误

Severity    Code    Description Project File    Line    Suppression State
 Error  CS0029  Cannot implicitly convert type > 

System.Collections.Generic.List<System.Linq.IGrouping<long,

ImportService.Model.Import>>' to

'System.Collections.Generic.List<ImportService.Model.Import>'

在这种情况下,如何通过查询正确构建组?,我正在使用 dapper 填充我的订单元素,所以它被填充了,只是不想允许组。

瞄准 我的目标是,我可以根据班级中的订单号发送电子邮件截图,并在电子邮件底部显示每个不同订单号的总行。

应该是一封邮件一封邮件,其中每个总数都在每组 OrderNo 的行之后

foreach (var item in orders)
{
  using (var tr = table.AddRow(classAttributes: "someattributes"))
  {
         tr.AddCell(item.OrderNo.ToString(), "style:font-bold;");
         tr.AddCell(item.ProductName.ToString(), "style:font-bold;");
         if (item.Status == (int)ImportStatus.NominalInvlaid)
         {
               tr.AddCell("Nominal Code Invlaid");
         }
         tr.AddCell(item.Costings.ToString(), "style:font-bold;");
         tr.AddCell("DB", "style:font-bold;");
        }

这应该显示在上面应该按顺序分组的行的底部

  using (var tr = table.AddRow(classAttributes: "someattributes"))
        {//this should be the total of item.costings a the bottom of the above
        tr.AddCell(TotalOrdervalue.ToString(), "style:font-bold;");
        }
   }

【问题讨论】:

  • A GroupBy 创建一个二维数组;列表>。您正在尝试将 > 转换为 List
  • @jdweng 它实际上是一个IEnumerable&lt;IGrouping&lt;long, Import&gt;&gt;,其中可枚举中的每个项目都有一个Key 类型为long,它本身就是一个IEnumerable&lt;Import&gt;。所以ToList 的结果是List&lt;IGrouping&lt;long, Import&gt;&gt;,它与List&lt;Import&gt; 不同。
  • 请注意,如果您只想将所有行按OrderNo 排列成一个List&lt;Import&gt;,那么您应该改为使用OrderBy。事实上,你可以在你的 dapper 代码中使用的 SQL 中做到这一点。
  • 那么这是一封电子邮件还是每个OrderNo 一封?如果是一封电子邮件,是所有总数都在底部还是每个总数都在每组OrderNo 的行之后?
  • @juharr 每个总数都在正确的每组 OrderNo 的行之后。

标签: c# linq group-by


【解决方案1】:

这是因为 group by 的结果不是导入列表,而是列表的集合。

尝试使用下面的代码,看看它是否有效

var groupedOrders = orders.GroupBy(g => g.OrderNo).ToList();

for 循环的一个例子是

foreach (var og in groupedOrders)
                {
                    foreach (var item in og)
                    {
                        ...your code
                    }
                }

【讨论】:

  • 所以最好有一个在 dappe 方面执行此操作的查询?或者是他们让它成为列表的一种方式
  • 但是那不允许我访问 for 循环中的每个元素呢?基于类
  • @rogue39nin,你应该写一个嵌套循环
  • @rogue39nin 如果您按它进行分组,则意味着您希望将行集合分组在一起。听起来你真正需要的只是OrderBy
  • @rogue39nin 在这种情况下,您将获取GroupByforeach 的结果,并且您将拥有一个具有Key 的项目,即OrderNo 和是IEnumerable&lt;Item&gt;,因此您只需要在那时相应地创建每封电子邮件。
猜你喜欢
  • 1970-01-01
  • 2015-05-28
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 2011-02-10
  • 2018-03-23
相关资源
最近更新 更多