1

If I have an IEnumerable<int> Values, I can write a Linq to Entities query, like so:

DataContext.Answers.Where(a => a.Organization == CurrentUser.Organization ||
    Values.Contains(a.QuestionId))

The (Values.Contains(a.QuestionId)) part is what my question concerns.

If Values were implemented instead as: ILookup<string, IEnumerable<int>>Values, how could I rewrite the query to get Answers where Values contains the key(a.Organization) and the IEnumerable values for that key contains a.QuestionId?

4

1 回答 1

0

首先,您需要将 扁平ILookup<string, IEnumerable<int>>化为IEnumerable具有组织和问题 ID 的某些项目。您需要获取查找中的所有组,从组中获取所有 id 集合,然后获取该集合中的所有 id,并将它们中的每一个转换为同时包含该 ID 和组的钥匙。然后,您可以使用Contains该集合来查看答案的组织和问题 ID 是否在该配对集合中。通过这样做,您可以将集合转换为 SQL 中的 IN 子句。当然,如果lookup特别大,那就有问题了;如果它很小,它不会。

你会这样做:

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

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

于 2015-02-13T16:27:43.793 回答