【问题标题】:LINQ: How to search 2 list ( Two list: Entity List and Array ) combined?LINQ:如何组合搜索 2 个列表(两个列表:实体列表和数组)?
【发布时间】:2012-05-07 21:48:37
【问题描述】:

假设我是Member 的实体,并且是我不想包含的名称列表。

var excludeNames = new [] { "A","B","C","D"};

var members = db.Members.Except(excludeNames);

或

 var excludeNames = new[]{ "A","B","C","D"};
 var Members = db.Members.Where(m=> excludeNames.Where(xcl => xcl != m.Name));

这些都不起作用。 我也试过这个:

 var excludeNames = new[] { "A","B","C","D"};
 var members = from m in db.Members
               from xcl in excludeNames
               where m.Name != xcl
               select m;

【问题讨论】:

  • 您遇到了什么错误?最后一个例子肯定可以工作。

标签: linq entity-framework linq-to-entities linq-to-objects


【解决方案1】:

尝试以下方法:

var excludeNames = new[] { "A","B","C","D"};
var members = from m in db.Members
              where !excludeNames.Contains(m.Name)
              select m;

请注意,即使 LINQ 允许您以多种方式表达查询,您仍然需要考虑到需要将查询转换为 SQL 的事实。 Entity Framework 支持的 SQL 方言将值列表与行集区别对待。

例如,您要在 SQL 中构建的查询是

SELECT *
FROM Members AS m
WHERE m.name NOT IN ('A', 'B', 'C', 'C')

(SQL 中的 x IN (list) 转换为 LINQ 中的 list.Contains(x)。)

例如,你不能说类似的话

SELECT *
FROM Members AS m
WHERE EXISTS(SELECT 1
             FROM ('A', 'B', 'C', 'C') AS xcl
             WHERE m.name != xcl)

也没有

SELECT *
FROM Members AS m,
     ('A', 'B', 'C', 'C') AS xcl
WHERE m.name != xcl

根本不允许这些查询。虽然 Entity Framework 在将您的 LINQ 查询转换为 SQL 时可以非常智能,但它确实有其局限性。

【讨论】:

    【解决方案2】:

    我认为这可能是一个很好的解决方案。

    var excludeNames = new [] { "A","B","C","D"};
    
    var members = db.Members.Where(member => excludeNames.Any(member.Name) == false).ToList() ;
    
    //or     
    var excludeNames = new [] { "A","B","C","D"};
    
    var members = db.Members.Where(member => !excludeNames.Any(member.Name)).ToList() ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      相关资源
      最近更新 更多