首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于ILookup的获取DataContext实体的Linq查询

基于ILookup的获取DataContext实体的Linq查询
EN

Stack Overflow用户
提问于 2015-02-13 23:49:00
回答 1查看 177关注 0票数 1

如果我有一个IEnumerable<int> Values,我可以编写一个Linq to Entities查询,如下所示:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2015-02-14 00:27:44

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

你可以这样做:

代码语言:javascript
复制
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,
                        }));

如果查找特别大,您可能别无选择,只能将表中的所有数据提取到内存中,并通过查找应用程序端的查找对其进行过滤,或者将查找中的数据上载到列表中的临时表中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28503379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档