如果用户列表不存在于另一个列表中,我想返回一个用户列表。
这是我目前正在尝试的但是它无效:
var disableUserList = dbUserList.Where(ds => dsUserList.Any(db => db.GlobalIdentity != ds.GlobalIdentity)).ToList();
答案 0 :(得分:4)
正如DmitryG指出的那样,除了这种情况以外,它的作用非常好。这是一个快速示例,其中用户'A','B','C',仅启用'A',因此'B'和'C'被写入控制台:
public static void Main(string[] args)
{
var activeList = new List<string> { "A" };
var userList = new List<string> {"A", "B", "C"};
var removalList = userList.Except(activeList);
foreach (var item in removalList)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
答案 1 :(得分:3)
我认为你需要否定你的逻辑。您当前的逻辑将始终返回true,因为dsUserList很可能具有GlobalIdentity与您的dbUserList条目不匹配的条目。因此,如果dsUserList中有任何匹配项,请将它们排除在外:
var disableUserList = dbUserList.Where(ds => !dsUserList.Any(db => db.GlobalIdentity == ds.GlobalIdentity)).ToList();
答案 2 :(得分:2)
您可以在Linq中使用DefaultIfEmpty
进行左连接,并过滤非连接条目(空记录)。
var query = from u in dbUserList
join g in dsUserList on u.GlobalIdentity equals g.GlobalIdentity
into joinedUsers
from ju in joinedUsers.DefaultIfEmpty()
where ju == null
select u;
答案 3 :(得分:1)
将Any
替换为All
。
var disableUserList = dbUserList.Where(ds => dsUserList.All(db => db.GlobalIdentity != ds.GlobalIdentity)).ToList();
答案 4 :(得分:1)
如果table是一对一的关系,那么这是更好的查询
var disableUserList = (from ds in dbUserLists
join db in dsUserLists on ds.GlobalIdentity equals db.GlobalIdentity into tmp from db in tmp.DefaultIfEmpty()
where
db.GlobalIdentity == null
select ds).ToList()
如果不是
var disableUserList = (from ds in dbUserLists
where
!db.dbUserLists.Any(db => db.GlobalIdentity == ds.GlobalIdentity)
select ds).ToList()
或
var disableUserList = dbUserList.Where(ds => !dsUserList.Any(db => db.GlobalIdentity == ds.GlobalIdentity)).ToList();