2010-09-28 130 views
1

如何在Linq查詢中進行排序和分組?如何在Linq中對象查詢進行排序和分組?

我試過..

Dim iPerson = From lqPersons In objPersons Where Len(lqPersons.Person) > 0 Group lqPersons By key = lqPersons.Name Into Group Order By Group descending Select Group, key 

    For Each i In iPerson 
     tmp = tmp & vbNewLine & i.key & ", " & i.Group.Count 
    Next 

上述工作,如果我刪除Order By Group Descending克勞斯,但有了它,我得到了Next語句中的錯誤..

至少一個對象必須實現IComparable。

我的查詢是獲取我的類/對象中的人的列表,他們的名稱被用作類/對象的項目的次數。

I.e.

Joe,4 | James,5 | Mike,4

有沒有人有任何想法我做錯了什麼?

+0

集團看起來像它的一個數據庫中的列;它也是一個用於SQL語句的保留/限制字。嘗試在您的數據庫/查詢中更改Group到GroupID。 – MRR0GERS 2010-09-28 16:45:26

+0

@snkmchnb:這不在數據庫中;它是按照標題和標籤的對象的LINQ。 – 2010-09-28 16:47:05

回答

0

is lqPersons.Name是一個字符串,還是一個包含first,last,middle等名字的結構或類?如果它是前者,你應該對此很好,因爲字符串是IComparable。如果Name是某個用戶定義的類的對象,則需要在該類上實現IComparable(提供排序算法使用的CompareTo()方法),或者Order通過Name的「primitive」子屬性,如LastName 。

編輯:剛看到別的東西。當您使用Group By時,結果的對象是Lookup;基本上是一個KeyValuePair,它具有一組值而不是一個值。查找不是IComparable。因此,不要按組排序,請嘗試按該組的密鑰標識符(lqPersons.Name)進行排序。

2

原諒我的C#,但不能你這樣做......

objPersons.Where(p=> p.Person > 0).GroupBy(p => p.Name).Select(p => new { Name= p.Key, Number = p.Count()}).OrderByDescending(p=> p.Number); 

主要理念:

  1. 的GroupBy像你一樣
  2. 使用您的主要選擇到一個新的對象(名稱)並計算該組中的人數
  3. 按降序排列
1

你的查詢是好的(在VB.NET中使用Group作爲一個名字沒有問題)實際上你必須使用Group,所以不用擔心),除非你應該有Order By鍵。

p.s.測試。

編輯:爲了完整起見,您可以重命名組,如下所示:

Dim iPerson = From lqPersons In objPersons 
       Where Len(lqPersons.Person) > 0 
       Group lqPersons By key = lqPersons.Name Into g = Group 
       Order By key Descending 
       Select g, key 

但是這無關你的問題...只是澄清這一點。

0

我在VB中做了類似的事情。 I have it on my blog as well.但基本上這裏是我開始使用的SQL。

SELECT orgno, psno, sche, projid, RecType, 
SUM(OBBudExpAmt) AS OBBudExpAmt, 
SUM(ABBudEncAmt) AS ABBudEncAmt 
FROM tbl908_BudSPDGrps 
WHERE orgno = '210' 
GROUP BY orgno, psno, sche, projid, RecType 

這裏是相應的LINQ。

Dim projids = From p In db.tbl908_BudSPDGrps _ 
Where p.orgno = options.GroupFilter _ 
Group p By p.orgno, p.psno, p.sche, p.projid, p.RecType _ 
Into g = Sum(p.OBBudExpAmt), h = Sum(p.ABBudEncAmt) _ 
Order By orgno, psno, sche, projid, RecType _ 
Select sche, RecType, g, h 

漂亮的自我解釋。希望它可以幫助你。

2

因爲在執行For Each循環時執行查詢(它被稱爲defferd執行),所以在下一條語句中出現錯誤。

錯誤居然說,你不能這樣做,因爲Ordey By GroupIGrouping沒有實現IComparable,所以你Group By語句來的結果不能由IGrouping本身進行排序。

您必須按IGrouping對象的元素數量排序。


試試這個(請注意,我不知道你的類什麼樣子...):

Dim objPersons = New YourClass() {New YourClass("Joe"), _ 
            New YourClass("Joe"), _ 
            New YourClass("Joe"), _ 
            New YourClass("James"), _ 
            New YourClass("James"), _ 
            New YourClass("James"), _ 
            New YourClass("James"), _ 
            New YourClass("Mike"), _ 
            New YourClass("Mike")} 

Dim query = objPersons.Where(function(p) p.Person > 0) _ 
         .GroupBy(Function(p) p.Name) _ 
         .OrderByDescending(Function(g) g.Count) _ 
         .Select(function(g) g.Key & ", " & g.Count()) 


For Each s In query 
    Console.WriteLine(s) 
Next 

輸出:

James, 4 
Joe, 3 
Mike, 2 
相關問題