2010-06-22 37 views
2

我写了一个简单的LINQ查询,如下所示:GROUP BY和点心条款在LINQ

var query = from c in context.ViewDeliveryClientActualStatus 
      join b in context.Booking on c.Booking equals b.Id 
      join bg in context.BookingGoods on c.Booking equals bg.BookingId 
      select new { c, b, bg }; 

我已筛选之前的查询与许多房屋,然后由一组字段需要组得到一些他们的总和,像这样:

var rows = from a in query 
      group a by new {h = a.c.BookingRefex, b = a.c.ClientRefex, c = a.b.PickupCity, d = a.b.PickupPostalCode} into g 
      select new 
      {      
       Booking_refex = g.Key.h, 
       Client_refex = g.Key.b, 
       //Local = g. 
       Sum_Quan = g.Sum(p => p.bg.Quantity), 
      }; 

我想从a我没有包含在GROUP BY子句中得到一些价值。我怎样才能获得这些价值?他们无法通过g访问。

+0

我不明白你是如何通过做群组来获得领域的。在你的例子中,你正在计算bg.Quantity的总和,它不是g.Key的一部分。你能更详细地解释你的问题吗? – 2010-06-22 10:56:13

+0

我通过总和访问了bg.Quantity,但是如果我键入g。它不在字段属性列表中。 – Hallaghan 2010-06-22 10:58:36

回答

4

LINQ表达式中的gIEnumerable,其中包含a's,并带有一个额外的属性Key。如果您想要访问不属于Keya字段,则必须执行某种聚合或选择。如果您知道组中所有元素的特定字段都相同,则可以从组中的第一个元素中选择字段的值。在这个例子中,我假设c有一个名为Value场:

var rows = from a in query 
    group a by new { 
    h = a.c.BookingRefex, 
    b = a.c.ClientRefex, 
    c = a.b.PickupCity, 
    d = a.b.PickupPostalCode 
    } into g 
    select new { 
    BookingRefex = g.Key.h, 
    ClientRefex = g.Key.b, 
    SumQuantity = g.Sum(p => p.bg.Quantity), 
    Value = g.First().c.Value 
    }; 

但是,如果c.Value是一组在同一你还不如将其包含在它使用g.Key.cValue分组和访问。

+0

感谢Martin,正是我需要的。还学到了一些有用的东西! – Hallaghan 2010-06-22 11:13:12

1

只需添加这些字段中

new {h = a.c.BookingRefex, b = a.c.ClientRefex, c = a.b.PickupCity, d = a.b.PickupPostalCode} 

他们会以g访问即可。

+0

这是否意味着我每次做一个组时都必须将每个字段添加到列表中?有很多领域要添加。 – Hallaghan 2010-06-22 10:23:05

+0

如果您不想按额外的字段进行分组,则不应将它们包括在用于创建组的对象中。 – 2010-06-22 10:24:21

+0

通过执行上面的指令,您只需获得新的{...}中陈述的元素;把它看作一个t-sql SELECT语句:如果你不选择*而是列的一个子集,其他的将不可访问。 – Mauro 2010-06-22 10:25:11