代码之家  ›  专栏  ›  技术社区  ›  nat

从LINQ存储过程中选择非重复计数

  •  1
  • nat  · 技术社区  · 14 年前

    我有一个存储过程,它返回一个结果集,因此:

    testid(guid)、testname、outcomeid(guid)、outcomename-字段

    测试guid1、测试名称1、输出guid1、输出1

    测试guid1、测试名称1、输出guid2、输出2

    测试guid1、测试名称1、输出guid3、输出3

    测试guid1、测试名称1、输出guid4、输出4

    测试guid1、测试名称1、输出guid5、输出5

    测试guid2、测试名称2、输出guid9、输出9

    测试guid2、测试名称2、输出guid1、输出1

    测试guid2、测试名称2、输出guid3、输出3

    等。 所以基本上有很多测试,每个测试都有很多结果,其中一些结果在测试中是通用的。

    我想做的是在所有测试中获得最大数量的结果,我想用lambda-linq类型的东西来实现这一点。 所以对于上面的结果,我要找数字5

    如果我这样做:

    var Results = dc.getTests(id); 
    //need the whole resultsset for binding to something in a mo.
    //then would like to do somethign along the lines of:
    int count = Results.GroupBy(t=>t.testID).count(*).Max() //or something?
    

    如果我调试,我得到(删除上面一行的count部分)一个igrouping linq,它确实有一个非公共的count属性,但我似乎无法做到。 不管怎样,我希望有更好的方法来获得这个号码。有人能给我开导一下吗

    非常感谢

    NAT

    1 回复  |  直到 14 年前
        1
  •  2
  •   Marc Gravell    14 年前
    var max = Results.GroupBy(t=>t.testID).Max(grp => grp.Count());
    

    但是,请注意 个人 我会在数据库中寻找一种方法来实现这一点,而不是通过网络获取所有数据,只为了得到一个数字。一个好的选择是将代码推送到UDF中,然后简单地更改SP SELECT * FROM dbo.YourUdf(args) -原因是UDF是 可组合的 ,因此可以将UDF映射到数据上下文中,并具有:

    var max = db.MyUdf(args).GroupBy(t=>t.testID).Max(grp => grp.Count());
    

    (也就是说,相同的代码),它可以完成这项工作 在服务器上 ,只是通过网络返回一个数字。