LINQ to SQL:分组和限制记录集

时间:2009-07-23 16:17:12

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

我正在使用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 };

感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

您真的想要所有这些群组的数据吗?如果是这样,你可以在.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,但每个条目都是类型而不是整个记录。

答案 1 :(得分:0)

我认为你不可能在一个查询中做到这一点(也许,但不是没有丑陋)。

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