C# 用于排除其他表中存在的数据的LINQ sql表达式
我正在尝试编写一个LINQ查询,以返回尚未分配的用户名列表。 我的C# 用于排除其他表中存在的数据的LINQ sql表达式,c#,sql,linq,C#,Sql,Linq,我正在尝试编写一个LINQ查询,以返回尚未分配的用户名列表。 我的用户名表如下所示: Id | Username 1 | user.1 2 | user.2 3 | user.3 Assignments表仅包含用户名,旁边是一些其他数据: Username | SomeOtherData user.1 | foo user.3 | bar 在上面的示例中,我尝试编写的LINQ查询应该返回user.2 不幸的是,我的查询返回的用户太多,我不知道如何调整我的LINQ表达式: f
用户名
表如下所示:
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表达式的最佳方法是什么,只返回那些不在assignments表中的用户名?您将在username上加入两个表,这不会返回在这两个表中都不常见的用户名。您需要选择分配表中不存在的用户名
Context.Usernames.Where(x=> !Assignments.Select(y => y.Username).Contains(X.Username));
编写相同查询的另一种方法:
Context.Usernames.Where(x=> Assignments.All(y => y.Username ! = x.UserName));
您将在username上连接两个表,这不会返回两个表中不常见的用户名。您需要选择分配表中不存在的用户名
Context.Usernames.Where(x=> !Assignments.Select(y => y.Username).Contains(X.Username));
编写相同查询的另一种方法:
Context.Usernames.Where(x=> Assignments.All(y => y.Username ! = x.UserName));
您需要使用DefaultIfEmpty进行左联接。大致如下:
from u in Usernames
join a in Assignments on u.Username equals a.Username into userAssignments
from ua in userAssignments.DefaultIfEmpty()
where ua == null
select u
您需要使用DefaultIfEmpty进行左联接。大致如下:
from u in Usernames
join a in Assignments on u.Username equals a.Username into userAssignments
from ua in userAssignments.DefaultIfEmpty()
where ua == null
select u
+1.我只是认为使用
All
扩展而不是Select
和Contains
会更干净-Context.Usernames.Where(x=>Context.Assignments.All(y=>y.Username!=x.Username))代码>是,同意。这样看起来更干净。(y) 非常感谢你的回答!如果要筛选其他字段(例如国家/地区),我将如何将此标准添加到表达式中?比方说,我希望只有那些国家==1的未分配用户。这样添加不会返回任何记录:Context.Usernames.Where(x=>Assignments.All(y=>y.Username!=x.Username&&y.Country==“1”)代码>+1。我只是认为使用All
扩展而不是Select
和Contains
会更干净-Context.Usernames.Where(x=>Context.Assignments.All(y=>y.Username!=x.Username))代码>是,同意。这样看起来更干净。(y) 非常感谢你的回答!如果要筛选其他字段(例如国家/地区),我将如何将此标准添加到表达式中?比方说,我希望只有那些国家==1的未分配用户。这样添加不会返回任何记录:Context.Usernames.Where(x=>Assignments.All(y=>y.Username!=x.Username&&y.Country==“1”)代码>两个查询都返回零行-与您的问题不一致。您可能需要共享更多信息。两个查询都返回零行-与您的问题不一致。您可能需要共享更多信息。