"IGrouping"不包含定义。

4

我一直在查看其他主题以了解如何在linq中执行GroupBy操作。我正在遵循已经为其他人工作的确切语法,但是它不起作用。

以下是查询:

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是一个包含ContactIDAmount等列的List<T>,但对于此查询,我只关心这两个列。
问题是,在select new中,g.无法给我返回原始列表pending中的任何列。当我尝试时,会出现以下错误信息:

IGrouping <int, LeadPurchases>不包含ContactID的定义,也没有扩展方法blah blah blah...

这是我想模拟的SQL语句:
SELECT 
    lp.PurchasedFromContactID, 
    SUM (lp.Amount) 
FROM 
    LeadPurchases lp
GROUP BY 
    lp.PurchasedFromContactID

你需要使用 g.Key.ContactID - Rob
这让我困惑: int没有包含ContactID的定义。 - Casey Crookston
3
抱歉 - 我现在有些不清醒。它应该只是 ContactID = g.Key,因为你只是按一个值进行分组。 - Rob
1个回答

12

你现在是基于ContactID进行分组,所以它应该是结果的键值,因此你需要使用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       
};

好的,这看起来很有前途!我会运行一些测试并回报。谢谢! - Casey Crookston
@CaseyCrookston:很酷,愉快地编程。 - sujith karivelil
1
好的,太棒了,它成功了!我可以在3分钟内将其标记为答案。与此同时,我知道这是对我的原始问题的补充,但是如果我想按更多列进行分组怎么办?您可以在答案中添加一列来展示如何除了ContactID之外再按一列进行分组吗? - Casey Crookston
2
@CaseyCrookston:没问题,我可以帮你。请查看我的回答中的更新内容。 - sujith karivelil
如何将此示例作为列表返回 - Dimitris Kougioumtzis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接