我正在使用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 };
感谢任何帮助。
答案 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个结果集。