2010-09-28 134 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 
相关问题