2011-10-18 77 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小時的工作之夜。謝謝! –