LINQ:如何搜索2个列表(两个列表:实体列表和数组)组合?

Md.*_*rim 1 linq linq-to-objects linq-to-entities entity-framework

假设我是Member我不想包含的名称的实体和名单.

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

var members = db.Members.Except(excludeNames);
Run Code Online (Sandbox Code Playgroud)

要么

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

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

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

Rub*_*ben 7

请尝试以下方法:

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

请注意,即使LINQ允许您以多种方式表达查询,您仍然需要考虑您的查询需要转换为SQL的事实.实体框架支持的SQL方言处理值列表与行集不同.

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

SELECT *
FROM Members AS m
WHERE m.name NOT IN ('A', 'B', 'C', 'C')
Run Code Online (Sandbox Code Playgroud)

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

例如,你不能说出类似的话

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

也不

SELECT *
FROM Members AS m,
     ('A', 'B', 'C', 'C') AS xcl
WHERE m.name != xcl
Run Code Online (Sandbox Code Playgroud)

这些查询根本不允许.虽然在将LINQ查询转换为SQL时,实体框架可以非常智能,但它确实有其局限性.