【问题标题】:IGrouping does not contain a definition forIGrouping 不包含对
【发布时间】:2019-07-17 21:49:03
【问题描述】:

我一直在这里查看其他线程,以了解如何在 linq 中进行 GroupBy。我正在遵循对其他人有用的 EXACT 语法,但是它不起作用。

这是查询:

var results = from p in pending
              group p by p.ContactID into g
              let amount = g.Sum(s => s.Amount)
              select new PaymentItemModel
              {
                  ContactID = g.ContactID, // <--- Error here
                  Amount = amount
              };

pending 是一个List&lt;T&gt;,其中包含ContactIDAmount 等列,但我在此查询中只关心这两列。

问题是,在select new 中,g. 不会给我原始列表pending 中的任何列。当我尝试时,我得到:

IGrouping &lt;int, LeadPurchases&gt; 不包含 ContactID 的定义,也没有扩展方法 blah blah blah...

这是我要模拟的 SQL:

SELECT 
    lp.PurchasedFromContactID, 
    SUM (lp.Amount) 
FROM 
    LeadPurchases lp
GROUP BY 
    lp.PurchasedFromContactID

【问题讨论】:

  • 你会想要g.Key.ContactID
  • 这让我明白了:int 不包含 ContactID 的定义
  • 抱歉 - 我的想法不正确。它应该只是ContactID = g.Key,因为您只是按单个值分组

标签: c# linq


【解决方案1】:

你是在ContactID的基础上进行分组的,所以它应该是结果的Key,所以你必须使用g.Key而不是g.ContactID;这意味着查询应该如下所示:

from p in pending
              group p by p.ContactID into g
              let amount = g.Sum(s => s.Amount)
              select new PaymentItemModel
              {
                  ContactID = g.Key,
                  Amount = amount
              };

更新:

如果您想基于多列执行分组,则 GroupBy 子句将如下所示:

group p by new
{
    p.ContactID,
    p.Field2,
    p.Field3
}into g
select new PaymentItemModel()
{
    ContactID = g.Key.ContactID,
    anotherField = g.Key.Field2,
    nextField = g.Key.Field3       
};

【讨论】:

  • 好的,这看起来很有希望!我会进行一些测试并报告回来。谢谢!
  • @CaseyCrookston:酷快乐编码
  • 好吧,太好了!它会让我在 3 分钟内将此标记为答案。同时,我知道这是对我的 OP 的补充,但是......如果我想按更多列分组怎么办?您是否介意在您的答案中添加以显示除 ContactID 之外再按一列分组的情况?
  • @CaseyCrookston :是的,我可以帮助你,在我的回答中查看更新
  • 如何将此示例返回为列表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多