Linq Query基于ILookup获取DataContext实体

时间:2015-02-13 15:49:00

标签: c# linq ilookup

如果我有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}}?

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,
                        }));

如果查找特别大,您可能别无选择,只能将表中的所有数据拉入内存并通过查看应用程序的查找来过滤它或者将该查找中的数据上传到列表中的临时表中。