如果我有IEnumerable<int> Values
,我可以写一个Linq to Entities查询,如下所示:
DataContext.Answers.Where(a => a.Organization == CurrentUser.Organization ||
Values.Contains(a.QuestionId))
(Values.Contains(a.QuestionId))
部分是我的问题所在。
如果Values
被实现为:ILookup<string, IEnumerable<int>>Values
,我怎么能重写查询以获取Answers
Values
包含密钥(a.Organization
)和IEnumerable
该密钥的a.QuestionId
值包含{{1}}?
答案 0 :(得分:0)
首先,您需要将ILookup<string, IEnumerable<int>>
展平为具有组织和问题ID的某个项目的IEnumerable
。您需要在查找中获取所有组,从组中获取所有ID集合,然后获取该集合中的所有ID,并将它们中的每一个转换为同时包含该ID的对象和小组的关键。然后,您可以对该集合使用Contains
,以查看答案的组织和问题ID是否在该配对集合中。通过这样做,您可以将集合转换为SQL中的IN子句。当然,如果查找特别大,那么这将是一个问题;如果它很小,那就不会。
你会这样做:
var flattenedValues = (from grouping in Values
from ids in grouping
from id in ids
select new
{
Organization = grouping.Key,
QuestionId = id,
})
.ToList();
DataContext.Answers.Where(a => a.Organization == CurrentUser.Organization ||
flattenedValues.Contains(new
{
Organization = a.Organization,
QuestionId = a.QuestionId,
}));
如果查找特别大,您可能别无选择,只能将表中的所有数据拉入内存并通过查看应用程序的查找来过滤它或者将该查找中的数据上传到列表中的临时表中。