2011-10-18 50 views
1

我有一个非常基本的SQL查询我试图重现:LINQ vb.net GROUP BY - 选择联接的列

 SELECT t1.id, t1.name, count(*), min(t2.inserted) as inserted_first,  max(t2.inserted) as inserted_last 
    FROM tbl1 t1 
    LEFT JOIN tbl2 t2 ON t1.id=t2.tbl1_id 
    WHERE t2.search=15 
    GROUP BY t1.id, t1.name 

这工作非常适合我。它允许我通过t1.id和t1.name的唯一项进行分组,但也可以获得此对的出现次数,以及链接表的t2.inserted的最小值和最大值。问题是,现在当我把它变成LINQ时,我得到:

Dim query = 
    From t1 In ent.TBL1 
    Join t2 In ent.TBL2 On t1.id Equals t2.tbl1_id 
    Where (t2.search=15) 
    Group t1 By t1.id, t1.name Into Group 
    Select New With { 
    .id = id, 
    .name = name, 
    .count = Group.Count, 
    .min_value = ???, 
    .max_Value = ??? 
    } 

我失去了我能做些什么来选择最小和最大值。 Group.Min会工作,如果它与分组表相同,但由于它是在t2中,因此我无法引用它。我也不能将它添加到我的团队中,因为它不同。

请注意,tbl2链接到tbl2.tbl1_id - > tbl1.id上的tbl1。此外,这是我的问题的一个虚弱的例子,而不是真正的现场模式。

我很欣赏在这个问题上

回答

1

我不是一个VB人的帮助,但我认为想:

Group t1, t2 By t1.id, t1.name Into Group 
Select New With { 
.id = id, 
.name = name, 
.count = Group.Count, 
.min_value = Group.Min(Function(x) x.t2.Inserted), 
.max_Value = Group.Max(Function(x) x.t2.Inserted) 
} 

注意如何在这里各组元素同时包含t1t2,这是你如何能够获得Inserted财产。这不是真正清楚你是否甚至需要t1t2任何其他地方,所以你可能能够使用:

Group t2.Inserted By t1.id, t1.name Into Group 
Select New With { 
.id = id, 
.name = name, 
.count = Group.Count, 
.min_value = Group.Min(), 
.max_Value = Group.Max() 
} 

不幸的是我的VB LINQ技能都达不到知道这是否是正确的挑战为你。如果你对C#感到满意(你可以转换它),我可以更轻松地帮你...

+0

当然,我可以随时移植C#。我将在今天晚些时候尝试,因为我正在结束一个12小时的工作之夜。谢谢! –