获取另一个列表中不存在的记录列表 - Linq

时间:2016-06-16 19:31:49

标签: c# .net linq

如果用户列表不存在于另一个列表中,我想返回一个用户列表。

这是我目前正在尝试的但是它无效:

var disableUserList = dbUserList.Where(ds => dsUserList.Any(db => db.GlobalIdentity != ds.GlobalIdentity)).ToList();

5 个答案:

答案 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();