Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于排除其他表中存在的数据的LINQ sql表达式_C#_Sql_Linq - Fatal编程技术网

C# 用于排除其他表中存在的数据的LINQ sql表达式

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

我正在尝试编写一个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表达式:

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”)两个查询都返回零行-与您的问题不一致。您可能需要共享更多信息。两个查询都返回零行-与您的问题不一致。您可能需要共享更多信息。