【问题标题】:Lambda expression "IN" operator Exists?Lambda 表达式“IN”运算符是否存在?
【发布时间】:2012-11-22 07:36:18
【问题描述】:

我正在寻找构建如下所示的 Lambda 表达式

IQueryable<Object> queryEntity = 
                _db.Projects.Where(Project=>Project.Id.IN(1,2,3,4));

我在 Lambda 表达式中找不到任何 IN 运算符。

有人有建议吗?

【问题讨论】:

标签: c# c#-4.0 lambda entity-framework-5


【解决方案1】:

为此使用IEnumerable.Contains

var idList = new[] { 1, 2, 3, 4 };
IQueryable<Object> queryEntity = 
                _db.Projects.Where(Project => idList.Contains(Project.Id));

您当然可以构造 idList 内联。

【讨论】:

  • 但请记住,如果这进入具有非常大的 idList(例如 8000 个 ID)的 DB,它可能会失败。我认为这是为了超出批量大小或……至少我有这种情况。
  • 是的 - 构造怪异的 LINQ 查询并转换为慢速 SQL 调用可能产生的所有问题都适用。但这适用于您对 IQueryable 所做的任何事情。 :)
  • 如果idList 真的很大,那么它很有可能是作为数据库查询结果出现的,在这种情况下,您应该针对该查询进行 JOIN ON,对吧?
  • 这是我问题的正确答案。它的工作也。但 Ids 列表可能超过 50,000 条记录。会不会有问题? var Ids = _db.Projects.Where(Project=>Project.Title!="test23rdoct").Select(pro => pro.Id); var compIds = _db.Companies.Where(comp => comp.Participants.Any(part => Ids.Contains(part.Project.Id)));
  • 我都同意,但是我会测试。感谢您的洞察讨论。这对我帮助很大。
【解决方案2】:

没有 in 运算符,但有一个 contains。颠倒你的逻辑:

IQueryable&lt;Object&gt; queryEntity = _db.Projects.Where(Project=&gt;(new []{1,2,3,4}).Contains(Project.Id));

【讨论】:

    【解决方案3】:

    您正在寻找IEnumerable.Contains

    _db.Projects.Where(Project => list.Contains(Project.Id));
    

    【讨论】:

      【解决方案4】:

      你可以自己写

      public static bool In(this object item, IEnumerable list)
      {
          return list.Contains(item);
      }
      
      public static bool In(this object item, params object[] list)
      {
          return item.In(list);
      }
      

      【讨论】:

      【解决方案5】:

      pseudocode 基于Anders 投票解决方案。

      1. 假设:使用来自 Wikipedia 的 Historical United States mints 的信息。
      2. 数据集:StateMints。
      3. 字段:位置,铸币厂。
      4. 要求:选择所有具有 mint id 的硬币。
      5. StateMints 样本数据:
        薄荷,位置

        1.O,路易斯安那州新奥尔良
        2.W,西点,纽约
        3.D,科罗拉多州丹佛市

      这是我目前的代码:

      List<string> mints = new List<string> { "C", "CC", "D", "M", "O", "P", "S", "W" };  
      var locations = StateMints.Where(p => mints.Contains(p.Mint.ToUpper())).Select(p => p.Location).ToList();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-14
        • 2011-03-14
        • 1970-01-01
        • 2013-01-16
        • 2014-11-13
        相关资源
        最近更新 更多