Linq GROUP BY还是在循环中手动分组?

时间:2015-10-28 04:53:15

标签: vb.net entity-framework linq

昨天我在stackoverflow上问了这个question。今天我意识到,如果我做GROUP BY,我还需要创建一种新类型的对象。

假设我有一些看起来像这样的数据:

var1 var2 var3 qty
1    a    1a   50
1    a    1a   25
2    b    2b   10
2    b    2b   15
2    b    2b   10
3    a    3a   25

这是我的工作LinQ查询

From j In MyTable
    Where j.var1 = "xxx"
    Group j By Key = New With {Key .var1 = j.var1, Key .var2= j.var2, Key .var3 = j.var3} Into Group
    Select New With {.var1 = Key.var1, .var2 = Key.var2, .var3 = Key.var3, .qty = Group.Sum(Function(x) x.qty)}

实际上我使用Entity Framework,代码看起来更像是

Dim foo = (From j In dbContext.MyTable
           Where j.var1 = anotherVariable
           Group j By Key = New With {Key .var1 = j.var1, Key .var2= j.var2, Key .var3 = j.var3} Into Group
           Select New With {.var1 = Key.var1, .var2 = Key.var2, .var3 = Key.var3, .quantity = Group.Sum(Function(x) x.Qty)}).ToArray()

foo是我生成的实体中不存在的新类型。但我有一个由我的实体框架生成的实体可以包含这些实体。这是MyTable本身。我只使用GROUP BY来汇总一个MyTable列。我查询MyTable实体,我也可以将结果放在MyTable实体中。

我的问题是

1)我可以写这样的东西

Dim foo = (From j In dbContext.MyTable
       Where j.var1 = anotherVariable
       Group j By Key = New With {Key .var1 = j.var1, Key .var2= j.var2, Key .var3 = j.var3} Into Group
       Select New MyTable With {.var1 = Key.var1, .var2 = Key.var2, .var3 = Key.var3, .qty = Group.Sum(Function(x) x.qty)}).ToArray()

在这种情况下,我是否需要明确地写出所有映射?

2)我应该改变主意吗?在没有GROUP BY的情况下进行更简单的查询,并尝试在VB.NET循环中进行分组和求和(For Each)。还是两个问题?打开以获取所有带有WHERE子句的MyTable和另一个带组的MyTable?

Dim foo = dbContext.MyTable.Where(Function(p As MyTable) p.var1 = anotherVariable).ToArray()
For Each bar In foo
    'Code to group and sum or another query
Next 

1 个答案:

答案 0 :(得分:0)

您将无法在LINQ to Entities查询中实例化MyTable,但您可以使用ToArray简单地枚举投影结果,然后使用另一个Select构建实体调用

相关问题