【问题标题】:LINQ to SQL: Grouping and limiting a record setLINQ to SQL:分组和限制记录集
【发布时间】:2009-07-23 16:17:11
【问题描述】:

我正在使用 LINQ to SQL,并且我有一个存储过程,它返回的结果集如下所示:

Type    Field1   Field2
 5        1        1
 6        2        0
21        0        0

我希望用这个记录集做一些事情:

1) 有 3 组结果,一组在 field1 和 field2 中都有值,一组在 field1 中有值但在 field2 中没有值,另一组在 field1 和 field2 中都有零。

2) 我只对类型的一个子集感兴趣。我有一个我正在寻找的类型 id 的列表(比如这个例子中的 5 和 21)。现在类型值存储在枚举中,但如果合适,我可以将它们移动到更好的数据类型。

我已经到了可以对每个集合进行分组的位置,但我不确定如何限制类型,所以我只带回我感兴趣的那些。

这是我所拥有的:

var result = from all in dataContext.sp(..variables...)
           group all by all into list
           let grp1 = (from a in list
                      where a.field1 != 0 && a.field2 != 0
                      select a)
           let grp2 = (from b in list
                     where b.field1 == 0 && b.field2 != 0
                     select b)
           let grp3 = (from c in list
                      where c.field1 == 0 && c.field2 == 0
                      select c)
           select new { grp1, grp2, grp3 };

感谢任何帮助。

【问题讨论】:

    标签: c# .net linq-to-sql


    【解决方案1】:

    您真的想要所有这些组的数据吗?如果是这样,您最好在 .NET 中进行分组 - 只需在 SQL 中过滤:

    // Assuming interestingTypes is an array or list of the interesting types
    var query = db.Whatever.Where(entry => interestingTypes.Contains(entry.Type)
                                  // I understand you're not interested in this group
                                  && !(entry.Field1==0 && entry.Field2==1));
    
    var grouped = query.AsEnumerable()
                       .GroupBy(entry => new { entry.Field1, entry.Field2 });
    

    GroupBy 的替代方法是使用 ToLookup:

    var lookup = query.AsEnumerable()
                      .ToLookup(entry => new { entry.Field1, entry.Field2 });
    

    然后:

    var values00 = lookup[new { Field1=0, Field2=0 }];
    

    (那么 values00 将是您的条目类型的 IEnumerable<T>。)

    如果您只对每个字段组的类型感兴趣,您可以将查找更改为:

    var lookup = query.AsEnumerable()
                      .ToLookup(entry => new { entry.Field1, entry.Field2 },
                                entry => entry.Type);
    

    您会以相同的方式获取values00,但每个条目将是类型而不是整个记录。

    【讨论】:

    • 2秒,这次你赢了! :)
    • 感谢乔恩,这很有帮助。干杯!
    【解决方案2】:

    我认为您无法在单个查询中做到这一点(也许,但不是不丑)。

    我建议存储存储过程的结果,并且只使用 3 个查询。或者修改存储过程以返回您正在寻找的 3 个结果集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多