首页 > 解决方案 > LINQ sql 表达式以排除其他表中存在的数据

问题描述

我正在尝试编写一个 LINQ 查询以返回尚未分配的用户名列表。我的Usernames表如下所示:

Id | Username  
1  | user.1
2  | user.2
3  | user.3

Assignments表仅包含用户名,旁边还有一些其他数据:

Username | SomeOtherData
user.1   | foo
user.3   | bar

我尝试编写的 LINQ 查询应该user.2在上面的示例中返回。

不幸的是,我的查询返回了太多用户,我不确定如何调整我的 LINQ 表达式:

from u in Usernames
    join a in Assignments on u.Username equals a.Username
    where u.Username != a.Username
    select u

添加 Distinct() 方法会过滤结果集,但仍会返回分配的用户名:

(from u in Usernames
    join a in Assignments on u.Username equals a.Username
    where u.Username != a.Username
    select new { u }).Distinct()

调整这些 LINQ 表达式以仅返回那些不在分配表中的用户名的最佳方法是什么?

标签: c#sqllinq

解决方案


您正在使用用户名加入两个表,这不会返回两个表中不常见的用户名。您需要选择分配表中不存在的用户名。

Context.Usernames.Where(x=> !Assignments.Select(y => y.Username).Contains(X.Username));

编写相同查询的另一种方式:

Context.Usernames.Where(x=> Assignments.All(y => y.Username ! = x.UserName));

推荐阅读