简体   繁体   English

如何使用Entity Framework在子查询中的位置?

[英]How to do a where in subquery using Entity Framework?

I have a query like: 我有一个查询,如:

var result = from u in this.DataContext.Users
             join l in DataContext.Locations on u.Id equals l.userId
             where u.active == 1
             select u;

return result ;

I want to add a subquery WHERE IN clause like: 我想添加一个子查询WHERE IN子句,例如:

WHERE u.Id IN (SELECT userId FROM approved_users)

Is this possible? 这可能吗?

I am not sure why you want it in a sub query, it seems simpler to just join the Approved Users table, but I do not know the requirement so I have presented two options. 我不确定为什么要在子查询中使用它,仅加入“批准的用户”表似乎更简单,但是我不知道要求,因此提供了两个选项。 One option that has a sub query and one option with the additional join. 一个带有子查询的选项,另一个带有附加联接的选项。 I am also making an assumption that you don't have any navigation properties. 我还假设您没有任何导航属性。

Option 1 - Subquery: 选项1-子查询:

var subQuery =
    from u in context.Users.Where(x => context.ApprovedUsers.Select(y => y.ApprovedUserId).Contains(x.UserId))
    join l in context.Locations on u.UserId equals l.UserId
    where u.IsActive == true
    select u;

which generates something like this 产生这样的东西

SELECT 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[IsActive] AS [IsActive]
FROM  [dbo].[User] AS [Extent1]
INNER JOIN [dbo].[Location] AS [Extent2] ON [Extent1].[UserId] = [Extent2].[UserId]
WHERE ( EXISTS (SELECT 
    1 AS [C1]
    FROM [dbo].[ApprovedUser] AS [Extent3]
    WHERE [Extent3].[ApprovedUserId] = [Extent1].[UserId]
)) AND (1 = [Extent1].[IsActive])

Option 2 - Additional Join: 选项2-额外加入:

var query =
    from u in context.Users
    join l in context.Locations on u.UserId equals l.UserId
    join au in context.ApprovedUsers on u.UserId equals au.ApprovedUserId
    where u.IsActive == true
    select u;

which generates: 产生:

SELECT 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[IsActive] AS [IsActive]
FROM   [dbo].[User] AS [Extent1]
INNER JOIN [dbo].[Location] AS [Extent2] ON [Extent1].[UserId] = [Extent2].[UserId]
INNER JOIN [dbo].[ApprovedUser] AS [Extent3] ON [Extent1].[UserId] = [Extent3].[ApprovedUserId]
WHERE 1 = [Extent1].[IsActive]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM