【问题标题】:Linq Query to get DataContext Entities based on ILookup基于 ILookup 获取 DataContext 实体的 Linq 查询
【发布时间】:2015-02-13 15:48:59
【问题描述】:

如果我有 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 值包含 @ 987654330@?

【问题讨论】:

  • 我已经给出了答案,但作为澄清,您确定在该逻辑中您想要 || 而不是 &&
  • 是的,基本前提是ILookup 将是另一个UserCurrentUser 共享的值的集合。就我而言,我想获取属于CurrentUser 或与CurrentUser 共享的所有答案。我正在使用ILookup,因为User 共享特定于他们的OrganizationCompany 配对的答案。

标签: c# linq ilookup


【解决方案1】:

首先,您需要将 ILookup<string, IEnumerable<int>> 扁平化为具有组织和问题 ID 的某些项目的 IEnumerable。您需要获取查找中的所有组,从组中获取所有 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,
                        }));

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

【讨论】:

  • 这给了我错误,“无法创建'匿名类型'类型的常量值。在这种情况下只支持原始类型或枚举类型。”
  • @GunnerBarnes 那么您可能需要将数据上传到临时表中或将数据从数据库拉到内存中,如答案中所述。
猜你喜欢
  • 2011-10-06
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多