Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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的简单示例_C#_Sql_Linq - Fatal编程技术网

C# 子查询Linq的简单示例

C# 子查询Linq的简单示例,c#,sql,linq,C#,Sql,Linq,T-SQL查询 Select * from dbo.User_Users Where UserID IN (Select UserID from Course_Enrollments) 上述查询的LINQ到实体替代方案 var innerquery = from en in Course_Enrollments select en.UserID; var query = from u in User_Users where innerquery.Contains(u.UserID) sele

T-SQL查询

Select * from dbo.User_Users
Where UserID IN (Select UserID from Course_Enrollments)
上述查询的LINQ到实体替代方案

var innerquery = from en in Course_Enrollments
select en.UserID;

var query = from u in User_Users
where innerquery.Contains(u.UserID)
select u;
stackoverflow上有很多复杂的子查询,我只想看一个简单的例子,说明如何通过linq完成一个简单的子查询。我就是这样做的,但是它不好,因为它向数据库发送了两个查询

from u in User_Users
where u.Course_Enrollments.Any()
select u
如果您设置了外键。如果没有,你可以这样做

from u in User_Users
join cu in Course_Enrollments on u.UserId equals cu.UserId
select u

您还应该使用
.Distinct()
调用将其中任何一个封装起来。简单的答案是使用关键字“let”并生成支持主实体条件集的子查询

var usersEnrolledInCourses = from u in User_Users
                                 let ces = from ce in Course_Enrollments
                                           select ce.UserID
                                 where ces.Contains(u.UserID)
                             select u;   
这将在TSQL中创建一个exists块,类似于

SELECT [Extent1].*
   FROM dbo.User_Users AS Extent1
   WHERE EXISTS (SELECT 1 AS [C1]
                     FROM dbo.Course_Enrollements AS Extent2
                     WHERE (Extent2.UserID = Extent1.UserId))
它与您所要求的非常接近,通常会在SQL Server上创建相同的查询计划


希望这有帮助

您是否确认通过探查器发送了2个查询?通常,在枚举IQueryable或使用类似ToList或FirstOrDefault的内容之前,查询不会具体化。不幸的是,此答案将导致EF将TSQL包装在查询周围一个昂贵的distinct中。我建议不要这样做,尤其是在较大的数据集上。@GregGrater,我不确定对于主查询中的每一行,特别是对于较大的数据集,与子查询相比,这种独特的方式会有多昂贵。特别是在Join之后,它应该会减少记录。如果您有其他选项,比如Join来提高性能,我不会进行内部子查询。对于用户中的每一行,您将执行一个完整的查询,然后执行包含。