昨天我在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
答案 0 :(得分:0)
您将无法在LINQ to Entities查询中实例化MyTable
,但您可以使用ToArray
简单地枚举投影结果,然后使用另一个Select
构建实体调用