2012-11-18 51 views
0

保持查看下面的代码,我想通过客户ID总结/将查询结果分组在客户ID列旁边的销售和收据列。GroupBy和选择语法选项

var sales = from s in context.Sales 
      select new { id = s.CustomerID, sales = s.Amount, receipts = (decimal)0 }; 

var receipts = from r in context.Receipts 
      select new { id = r.CustomerID, sales = (decimal)0, receipts = r.Amount }; 

var summary = sales.Union(receipts).ToList(); 

我试着使用一些组合来实现相同的:

var summary = sales.Union(receipts).GroupBy(e=>e.id).Select(...) 

...但无济于事。

期待获得正确的相关语法。

+0

'var summary = sales.Union(receipts).GroupBy(e => e.id).Select(g => new {g。.....});'' 为什么我不能在IGrouping的成员列表中获取查询列,“g”参数?如果我做错了什么? –

回答

0

你已经接近了,虽然我们不得不猜测包含了什么Select(...)。你可以这样做:

summary 
    .GroupBy(s => s.id) 
    .Select(g => new { id = g.Key, 
         salesSum = g.Sum(x => x.sales), 
         receiptsSum = g.Sum(x => x.receipts) 
        }) 
+0

中更新太棒了!谢谢。 –

0

试试这个

var salesAndreceipts = from data in context.Receipts 
           join data2 in context.Receipts on data.CustomerID on data2.CustomerID 
           select new { id = r.CustomerID, sales = data.Sales, receipts = data2.Amount }; 

更新代替上述的 ,试图从销售和收据获取数据后,下方:

 var salesAndReceipts = sales.Union(receipts).ToList(); 


     var groupedData = from data in salesAndreceipts 
          group data by new {id=data.CustomerID} 
           into SalesRecepientGroup 
           Select new 
           { 
            id = SalesRecepientGroup.Key.CustomerID, 
            sales = SalesRecepientGroup.Sum(x=>x.Sales), 
            receipts = SalesRecepientGroup.Sum(x=>x.Amount) 

           }; 

希望这有助于.. :)

更新

然后,您可以检查它在EFProfiler下生成的查询并优化这些查询。

+0

Yogiraj!他们是您的salesAndreceipts查询中的逻辑错误,因为销售和收货表格没有1:N关系。在您的代码中,它将从“销售”将所有特定客户的行连接到“收据”中特定客户的所有行。 这就是为什么我使用.Union()加入了两个查询。 –

+0

您可以在联盟数据上运行groupby,并在答案 – Yogiraj