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)
请尝试以下方法:
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时,实体框架可以非常智能,但它确实有其局限性.