Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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# 是否可以改进此实体框架查询以提高性能?_C#_Sql Server_Entity Framework - Fatal编程技术网

C# 是否可以改进此实体框架查询以提高性能?

C# 是否可以改进此实体框架查询以提高性能?,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,*更新* 我无法删除这个问题,即使从长远来看它实际上不是一个问题。。。我仍然有一些代码,从我工作的时候,它做单独的查询和填充这些字段的一些。。。当我去掉那个密码的时候。。。以下查询运行速度非常快(2秒): 但是这个实体框架查询需要很长时间(大约20-25秒)。。。尤其是在数据库位于不同服务器上的生产环境中: public IQueryable<ApplicationUser> QueriableUsersList() { return _context.Users.Order

*更新*


我无法删除这个问题,即使从长远来看它实际上不是一个问题。。。我仍然有一些代码,从我工作的时候,它做单独的查询和填充这些字段的一些。。。当我去掉那个密码的时候。。。以下查询运行速度非常快(2秒):

但是这个实体框架查询需要很长时间(大约20-25秒)。。。尤其是在数据库位于不同服务器上的生产环境中:

public IQueryable<ApplicationUser> QueriableUsersList()
{
    return _context.Users.OrderBy(u => u.UserName)           
        .Include(u => u.Accounts.Select(a => a.Broker))
        .Include(u => u.Roles);
}
然后,为每个用户选择其中一个:

SELECT TOP (1) 
[Extent1].[BrokerId] AS [BrokerId], 
[Extent1].[Name] AS [Name], 
[Extent1].[Code] AS [Code], 
[Extent1].[IsExternal] AS [IsExternal]
FROM [dbo].[Brokers] AS [Extent1]
WHERE [Extent1].[BrokerId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2
SELECT 
[Project2].[Id] AS [Id], 
[Project2].[ReferralId] AS [ReferralId], 
[Project2].[FirstName] AS [FirstName], 
[Project2].[LastName] AS [LastName], 
[Project2].[Address] AS [Address], 
[Project2].[Address2] AS [Address2], 
[Project2].[Zip] AS [Zip], 
[Project2].[City] AS [City], 
[Project2].[StateProvince] AS [StateProvince], 
[Project2].[Country] AS [Country], 
[Project2].[State] AS [State], 
[Project2].[startPopupChecked] AS [startPopupChecked], 
[Project2].[DateAdded] AS [DateAdded], 
[Project2].[CurrentPortfolioId] AS [CurrentPortfolioId], 
[Project2].[NotificationsEmailAddress] AS [NotificationsEmailAddress], 
[Project2].[NotificationMobileNumber] AS [NotificationMobileNumber], 
[Project2].[ReceivesEmailNotifications] AS [ReceivesEmailNotifications], 
[Project2].[ReceivesTextNotifications] AS [ReceivesTextNotifications], 
[Project2].[IsActive] AS [IsActive], 
[Project2].[HasSeen] AS [HasSeen], 
[Project2].[Email] AS [Email], 
[Project2].[EmailConfirmed] AS [EmailConfirmed], 
[Project2].[PasswordHash] AS [PasswordHash], 
[Project2].[SecurityStamp] AS [SecurityStamp], 
[Project2].[PhoneNumber] AS [PhoneNumber], 
[Project2].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
[Project2].[TwoFactorEnabled] AS [TwoFactorEnabled], 
[Project2].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
[Project2].[LockoutEnabled] AS [LockoutEnabled], 
[Project2].[AccessFailedCount] AS [AccessFailedCount], 
[Project2].[UserName] AS [UserName], 
[Project2].[BlockOrder_BlockOrderId] AS [BlockOrder_BlockOrderId], 
[Project2].[C1] AS [C1], 
[Project2].[UserId] AS [UserId], 
[Project2].[RoleId] AS [RoleId]
FROM ( SELECT 
    [Limit1].[Id] AS [Id], 
    [Limit1].[ReferralId] AS [ReferralId], 
    [Limit1].[FirstName] AS [FirstName], 
    [Limit1].[LastName] AS [LastName], 
    [Limit1].[Address] AS [Address], 
    [Limit1].[Address2] AS [Address2], 
    [Limit1].[Zip] AS [Zip], 
    [Limit1].[City] AS [City], 
    [Limit1].[StateProvince] AS [StateProvince], 
    [Limit1].[Country] AS [Country], 
    [Limit1].[State] AS [State], 
    [Limit1].[startPopupChecked] AS [startPopupChecked], 
    [Limit1].[DateAdded] AS [DateAdded], 
    [Limit1].[CurrentPortfolioId] AS [CurrentPortfolioId], 
    [Limit1].[NotificationsEmailAddress] AS [NotificationsEmailAddress], 
    [Limit1].[NotificationMobileNumber] AS [NotificationMobileNumber], 
    [Limit1].[ReceivesEmailNotifications] AS [ReceivesEmailNotifications], 
    [Limit1].[ReceivesTextNotifications] AS [ReceivesTextNotifications], 
    [Limit1].[IsActive] AS [IsActive], 
    [Limit1].[HasSeen] AS [HasSeen], 
    [Limit1].[Email] AS [Email], 
    [Limit1].[EmailConfirmed] AS [EmailConfirmed], 
    [Limit1].[PasswordHash] AS [PasswordHash], 
    [Limit1].[SecurityStamp] AS [SecurityStamp], 
    [Limit1].[PhoneNumber] AS [PhoneNumber], 
    [Limit1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
    [Limit1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
    [Limit1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
    [Limit1].[LockoutEnabled] AS [LockoutEnabled], 
    [Limit1].[AccessFailedCount] AS [AccessFailedCount], 
    [Limit1].[UserName] AS [UserName], 
    [Limit1].[BlockOrder_BlockOrderId] AS [BlockOrder_BlockOrderId], 
    [Extent2].[UserId] AS [UserId], 
    [Extent2].[RoleId] AS [RoleId], 
    CASE WHEN ([Extent2].[UserId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
    FROM   (SELECT TOP (1) 
        [Extent1].[Id] AS [Id], 
        [Extent1].[ReferralId] AS [ReferralId], 
        [Extent1].[FirstName] AS [FirstName], 
        [Extent1].[LastName] AS [LastName], 
        [Extent1].[Address] AS [Address], 
        [Extent1].[Address2] AS [Address2], 
        [Extent1].[Zip] AS [Zip], 
        [Extent1].[City] AS [City], 
        [Extent1].[StateProvince] AS [StateProvince], 
        [Extent1].[Country] AS [Country], 
        [Extent1].[State] AS [State], 
        [Extent1].[startPopupChecked] AS [startPopupChecked], 
        [Extent1].[DateAdded] AS [DateAdded], 
        [Extent1].[CurrentPortfolioId] AS [CurrentPortfolioId], 
        [Extent1].[NotificationsEmailAddress] AS [NotificationsEmailAddress], 
        [Extent1].[NotificationMobileNumber] AS [NotificationMobileNumber], 
        [Extent1].[ReceivesEmailNotifications] AS [ReceivesEmailNotifications], 
        [Extent1].[ReceivesTextNotifications] AS [ReceivesTextNotifications], 
        [Extent1].[IsActive] AS [IsActive], 
        [Extent1].[HasSeen] AS [HasSeen], 
        [Extent1].[Email] AS [Email], 
        [Extent1].[EmailConfirmed] AS [EmailConfirmed], 
        [Extent1].[PasswordHash] AS [PasswordHash], 
        [Extent1].[SecurityStamp] AS [SecurityStamp], 
        [Extent1].[PhoneNumber] AS [PhoneNumber], 
        [Extent1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
        [Extent1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
        [Extent1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
        [Extent1].[LockoutEnabled] AS [LockoutEnabled], 
        [Extent1].[AccessFailedCount] AS [AccessFailedCount], 
        [Extent1].[UserName] AS [UserName], 
        [Extent1].[BlockOrder_BlockOrderId] AS [BlockOrder_BlockOrderId]
        FROM [dbo].[AspNetUsers] AS [Extent1]
        WHERE [Extent1].[Id] = @p__linq__0 ) AS [Limit1]
    LEFT OUTER JOIN [dbo].[AspNetUserRoles] AS [Extent2] ON [Limit1].[Id] = [Extent2].[UserId]
)  AS [Project2]
ORDER BY [Project2].[Id] ASC, [Project2].[C1] ASC',N'@p__linq__0 int',@p__linq__0=346
以及每个用户的一个:

SELECT TOP (1) 
[Extent1].[BrokerId] AS [BrokerId], 
[Extent1].[Name] AS [Name], 
[Extent1].[Code] AS [Code], 
[Extent1].[IsExternal] AS [IsExternal]
FROM [dbo].[Brokers] AS [Extent1]
WHERE [Extent1].[BrokerId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2
SELECT 
[Project2].[Id] AS [Id], 
[Project2].[ReferralId] AS [ReferralId], 
[Project2].[FirstName] AS [FirstName], 
[Project2].[LastName] AS [LastName], 
[Project2].[Address] AS [Address], 
[Project2].[Address2] AS [Address2], 
[Project2].[Zip] AS [Zip], 
[Project2].[City] AS [City], 
[Project2].[StateProvince] AS [StateProvince], 
[Project2].[Country] AS [Country], 
[Project2].[State] AS [State], 
[Project2].[startPopupChecked] AS [startPopupChecked], 
[Project2].[DateAdded] AS [DateAdded], 
[Project2].[CurrentPortfolioId] AS [CurrentPortfolioId], 
[Project2].[NotificationsEmailAddress] AS [NotificationsEmailAddress], 
[Project2].[NotificationMobileNumber] AS [NotificationMobileNumber], 
[Project2].[ReceivesEmailNotifications] AS [ReceivesEmailNotifications], 
[Project2].[ReceivesTextNotifications] AS [ReceivesTextNotifications], 
[Project2].[IsActive] AS [IsActive], 
[Project2].[HasSeen] AS [HasSeen], 
[Project2].[Email] AS [Email], 
[Project2].[EmailConfirmed] AS [EmailConfirmed], 
[Project2].[PasswordHash] AS [PasswordHash], 
[Project2].[SecurityStamp] AS [SecurityStamp], 
[Project2].[PhoneNumber] AS [PhoneNumber], 
[Project2].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
[Project2].[TwoFactorEnabled] AS [TwoFactorEnabled], 
[Project2].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
[Project2].[LockoutEnabled] AS [LockoutEnabled], 
[Project2].[AccessFailedCount] AS [AccessFailedCount], 
[Project2].[UserName] AS [UserName], 
[Project2].[BlockOrder_BlockOrderId] AS [BlockOrder_BlockOrderId], 
[Project2].[C1] AS [C1], 
[Project2].[UserId] AS [UserId], 
[Project2].[RoleId] AS [RoleId]
FROM ( SELECT 
    [Limit1].[Id] AS [Id], 
    [Limit1].[ReferralId] AS [ReferralId], 
    [Limit1].[FirstName] AS [FirstName], 
    [Limit1].[LastName] AS [LastName], 
    [Limit1].[Address] AS [Address], 
    [Limit1].[Address2] AS [Address2], 
    [Limit1].[Zip] AS [Zip], 
    [Limit1].[City] AS [City], 
    [Limit1].[StateProvince] AS [StateProvince], 
    [Limit1].[Country] AS [Country], 
    [Limit1].[State] AS [State], 
    [Limit1].[startPopupChecked] AS [startPopupChecked], 
    [Limit1].[DateAdded] AS [DateAdded], 
    [Limit1].[CurrentPortfolioId] AS [CurrentPortfolioId], 
    [Limit1].[NotificationsEmailAddress] AS [NotificationsEmailAddress], 
    [Limit1].[NotificationMobileNumber] AS [NotificationMobileNumber], 
    [Limit1].[ReceivesEmailNotifications] AS [ReceivesEmailNotifications], 
    [Limit1].[ReceivesTextNotifications] AS [ReceivesTextNotifications], 
    [Limit1].[IsActive] AS [IsActive], 
    [Limit1].[HasSeen] AS [HasSeen], 
    [Limit1].[Email] AS [Email], 
    [Limit1].[EmailConfirmed] AS [EmailConfirmed], 
    [Limit1].[PasswordHash] AS [PasswordHash], 
    [Limit1].[SecurityStamp] AS [SecurityStamp], 
    [Limit1].[PhoneNumber] AS [PhoneNumber], 
    [Limit1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
    [Limit1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
    [Limit1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
    [Limit1].[LockoutEnabled] AS [LockoutEnabled], 
    [Limit1].[AccessFailedCount] AS [AccessFailedCount], 
    [Limit1].[UserName] AS [UserName], 
    [Limit1].[BlockOrder_BlockOrderId] AS [BlockOrder_BlockOrderId], 
    [Extent2].[UserId] AS [UserId], 
    [Extent2].[RoleId] AS [RoleId], 
    CASE WHEN ([Extent2].[UserId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
    FROM   (SELECT TOP (1) 
        [Extent1].[Id] AS [Id], 
        [Extent1].[ReferralId] AS [ReferralId], 
        [Extent1].[FirstName] AS [FirstName], 
        [Extent1].[LastName] AS [LastName], 
        [Extent1].[Address] AS [Address], 
        [Extent1].[Address2] AS [Address2], 
        [Extent1].[Zip] AS [Zip], 
        [Extent1].[City] AS [City], 
        [Extent1].[StateProvince] AS [StateProvince], 
        [Extent1].[Country] AS [Country], 
        [Extent1].[State] AS [State], 
        [Extent1].[startPopupChecked] AS [startPopupChecked], 
        [Extent1].[DateAdded] AS [DateAdded], 
        [Extent1].[CurrentPortfolioId] AS [CurrentPortfolioId], 
        [Extent1].[NotificationsEmailAddress] AS [NotificationsEmailAddress], 
        [Extent1].[NotificationMobileNumber] AS [NotificationMobileNumber], 
        [Extent1].[ReceivesEmailNotifications] AS [ReceivesEmailNotifications], 
        [Extent1].[ReceivesTextNotifications] AS [ReceivesTextNotifications], 
        [Extent1].[IsActive] AS [IsActive], 
        [Extent1].[HasSeen] AS [HasSeen], 
        [Extent1].[Email] AS [Email], 
        [Extent1].[EmailConfirmed] AS [EmailConfirmed], 
        [Extent1].[PasswordHash] AS [PasswordHash], 
        [Extent1].[SecurityStamp] AS [SecurityStamp], 
        [Extent1].[PhoneNumber] AS [PhoneNumber], 
        [Extent1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
        [Extent1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
        [Extent1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
        [Extent1].[LockoutEnabled] AS [LockoutEnabled], 
        [Extent1].[AccessFailedCount] AS [AccessFailedCount], 
        [Extent1].[UserName] AS [UserName], 
        [Extent1].[BlockOrder_BlockOrderId] AS [BlockOrder_BlockOrderId]
        FROM [dbo].[AspNetUsers] AS [Extent1]
        WHERE [Extent1].[Id] = @p__linq__0 ) AS [Limit1]
    LEFT OUTER JOIN [dbo].[AspNetUserRoles] AS [Extent2] ON [Limit1].[Id] = [Extent2].[UserId]
)  AS [Project2]
ORDER BY [Project2].[Id] ASC, [Project2].[C1] ASC',N'@p__linq__0 int',@p__linq__0=346

您将连接3个表,从表中获取所有数据,我认为您并没有任何索引列,并且数据库位于另一台服务器上

1) 筛选记录,因为您并不需要所有记录

2) 只选择您需要的列,而不是u.,a。返回所有列数据的

3) 为数据库添加索引列(对于大多数情况下出现在where子句中的列,应使用索引列)


并检查数据库服务器上的查询执行时间,查看是否不是网络延迟

是否跟踪了第二条语句生成的SQL?看起来它将加载所有用户、帐户、代理和角色,而不进行任何您想要的加入和筛选。如果这些桌子很大,这可能需要时间

(编辑:对不起,我刚刚注意到您已经这样做了。)

我认为,如果您想生成一些类似于第一条语句的SQL,就必须使用linq。如果不访问您的模型,很难准确地知道您需要什么,但我怀疑它看起来会像:

var users = 
    from user in context.Users
    join acc in Accounts on user.ID equals acc.ClientId
    join broker in Brokers on acc.BrokerId equals broker.brokerid
    join r in Roles on user.id equals r.userid into roles
    from role in roles.DefaultIfEmpty()
    where role.RoleId == 1
    select user;   // or whatever you want to select

return users.ToList();
棘手的部分是左外连接,目前我还不能检查语法,但我希望这能有所帮助

通过使用SQL Server profiler进行实体框架查询,我可以看到以下内容之一:

SELECT 
[Project1].[Id] AS [Id], 
[Project1].[UserName] AS [UserName], 
[Project1].[FirstName] AS [FirstName], 
[Project1].[LastName] AS [LastName], 
[Project1].[PhoneNumber] AS [PhoneNumber], 
[Project1].[Email] AS [Email], 
[Project1].[Address] AS [Address], 
[Project1].[City] AS [City], 
[Project1].[State] AS [State], 
[Project1].[Zip] AS [Zip], 
[Project1].[DateAdded] AS [DateAdded], 
[Project1].[IsActive] AS [IsActive], 
[Project1].[C1] AS [C1], 
[Project1].[AccountId] AS [AccountId], 
[Project1].[ClientId] AS [ClientId], 
[Project1].[BrokerId] AS [BrokerId], 
[Project1].[AccountNumber] AS [AccountNumber], 
[Project1].[BrokerUserName] AS [BrokerUserName], 
[Project1].[BrokerPasswordHash] AS [BrokerPasswordHash], 
[Project1].[EquityCurve] AS [EquityCurve], 
[Project1].[CapitalInvested] AS [CapitalInvested], 
[Project1].[IsSimulated] AS [IsSimulated], 
[Project1].[ClosedProfit] AS [ClosedProfit], 
[Project1].[MarketValueTimeStamp] AS [MarketValueTimeStamp], 
[Project1].[IsAuthorizedForLiveTrading] AS [IsAuthorizedForLiveTrading], 
[Project1].[ActivatedOn] AS [ActivatedOn]
FROM ( SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[FirstName] AS [FirstName], 
    [Extent1].[LastName] AS [LastName], 
    [Extent1].[Address] AS [Address], 
    [Extent1].[Zip] AS [Zip], 
    [Extent1].[City] AS [City], 
    [Extent1].[State] AS [State], 
    [Extent1].[DateAdded] AS [DateAdded], 
    [Extent1].[IsActive] AS [IsActive], 
    [Extent1].[Email] AS [Email], 
    [Extent1].[PhoneNumber] AS [PhoneNumber], 
    [Extent1].[UserName] AS [UserName], 
    [Extent2].[AccountId] AS [AccountId], 
    [Extent2].[ClientId] AS [ClientId], 
    [Extent2].[BrokerId] AS [BrokerId], 
    [Extent2].[AccountNumber] AS [AccountNumber], 
    [Extent2].[BrokerUserName] AS [BrokerUserName], 
    [Extent2].[BrokerPasswordHash] AS [BrokerPasswordHash], 
    [Extent2].[EquityCurve] AS [EquityCurve], 
    [Extent2].[CapitalInvested] AS [CapitalInvested], 
    [Extent2].[IsSimulated] AS [IsSimulated], 
    [Extent2].[ClosedProfit] AS [ClosedProfit], 
    [Extent2].[MarketValueTimeStamp] AS [MarketValueTimeStamp], 
    [Extent2].[IsAuthorizedForLiveTrading] AS [IsAuthorizedForLiveTrading], 
    [Extent2].[ActivatedOn] AS [ActivatedOn], 
    CASE WHEN ([Extent2].[AccountId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
    FROM  [dbo].[AspNetUsers] AS [Extent1]
    LEFT OUTER JOIN [dbo].[Accounts] AS [Extent2] ON [Extent1].[Id] = [Extent2].[ClientId]
)  AS [Project1]
ORDER BY [Project1].[UserName] ASC, [Project1].[Id] ASC, [Project1].[C1] ASC
然后,为每个用户选择其中一个:

SELECT TOP (1) 
[Extent1].[BrokerId] AS [BrokerId], 
[Extent1].[Name] AS [Name], 
[Extent1].[Code] AS [Code], 
[Extent1].[IsExternal] AS [IsExternal]
FROM [dbo].[Brokers] AS [Extent1]
WHERE [Extent1].[BrokerId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2
SELECT 
[Project2].[Id] AS [Id], 
[Project2].[ReferralId] AS [ReferralId], 
[Project2].[FirstName] AS [FirstName], 
[Project2].[LastName] AS [LastName], 
[Project2].[Address] AS [Address], 
[Project2].[Address2] AS [Address2], 
[Project2].[Zip] AS [Zip], 
[Project2].[City] AS [City], 
[Project2].[StateProvince] AS [StateProvince], 
[Project2].[Country] AS [Country], 
[Project2].[State] AS [State], 
[Project2].[startPopupChecked] AS [startPopupChecked], 
[Project2].[DateAdded] AS [DateAdded], 
[Project2].[CurrentPortfolioId] AS [CurrentPortfolioId], 
[Project2].[NotificationsEmailAddress] AS [NotificationsEmailAddress], 
[Project2].[NotificationMobileNumber] AS [NotificationMobileNumber], 
[Project2].[ReceivesEmailNotifications] AS [ReceivesEmailNotifications], 
[Project2].[ReceivesTextNotifications] AS [ReceivesTextNotifications], 
[Project2].[IsActive] AS [IsActive], 
[Project2].[HasSeen] AS [HasSeen], 
[Project2].[Email] AS [Email], 
[Project2].[EmailConfirmed] AS [EmailConfirmed], 
[Project2].[PasswordHash] AS [PasswordHash], 
[Project2].[SecurityStamp] AS [SecurityStamp], 
[Project2].[PhoneNumber] AS [PhoneNumber], 
[Project2].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
[Project2].[TwoFactorEnabled] AS [TwoFactorEnabled], 
[Project2].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
[Project2].[LockoutEnabled] AS [LockoutEnabled], 
[Project2].[AccessFailedCount] AS [AccessFailedCount], 
[Project2].[UserName] AS [UserName], 
[Project2].[BlockOrder_BlockOrderId] AS [BlockOrder_BlockOrderId], 
[Project2].[C1] AS [C1], 
[Project2].[UserId] AS [UserId], 
[Project2].[RoleId] AS [RoleId]
FROM ( SELECT 
    [Limit1].[Id] AS [Id], 
    [Limit1].[ReferralId] AS [ReferralId], 
    [Limit1].[FirstName] AS [FirstName], 
    [Limit1].[LastName] AS [LastName], 
    [Limit1].[Address] AS [Address], 
    [Limit1].[Address2] AS [Address2], 
    [Limit1].[Zip] AS [Zip], 
    [Limit1].[City] AS [City], 
    [Limit1].[StateProvince] AS [StateProvince], 
    [Limit1].[Country] AS [Country], 
    [Limit1].[State] AS [State], 
    [Limit1].[startPopupChecked] AS [startPopupChecked], 
    [Limit1].[DateAdded] AS [DateAdded], 
    [Limit1].[CurrentPortfolioId] AS [CurrentPortfolioId], 
    [Limit1].[NotificationsEmailAddress] AS [NotificationsEmailAddress], 
    [Limit1].[NotificationMobileNumber] AS [NotificationMobileNumber], 
    [Limit1].[ReceivesEmailNotifications] AS [ReceivesEmailNotifications], 
    [Limit1].[ReceivesTextNotifications] AS [ReceivesTextNotifications], 
    [Limit1].[IsActive] AS [IsActive], 
    [Limit1].[HasSeen] AS [HasSeen], 
    [Limit1].[Email] AS [Email], 
    [Limit1].[EmailConfirmed] AS [EmailConfirmed], 
    [Limit1].[PasswordHash] AS [PasswordHash], 
    [Limit1].[SecurityStamp] AS [SecurityStamp], 
    [Limit1].[PhoneNumber] AS [PhoneNumber], 
    [Limit1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
    [Limit1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
    [Limit1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
    [Limit1].[LockoutEnabled] AS [LockoutEnabled], 
    [Limit1].[AccessFailedCount] AS [AccessFailedCount], 
    [Limit1].[UserName] AS [UserName], 
    [Limit1].[BlockOrder_BlockOrderId] AS [BlockOrder_BlockOrderId], 
    [Extent2].[UserId] AS [UserId], 
    [Extent2].[RoleId] AS [RoleId], 
    CASE WHEN ([Extent2].[UserId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
    FROM   (SELECT TOP (1) 
        [Extent1].[Id] AS [Id], 
        [Extent1].[ReferralId] AS [ReferralId], 
        [Extent1].[FirstName] AS [FirstName], 
        [Extent1].[LastName] AS [LastName], 
        [Extent1].[Address] AS [Address], 
        [Extent1].[Address2] AS [Address2], 
        [Extent1].[Zip] AS [Zip], 
        [Extent1].[City] AS [City], 
        [Extent1].[StateProvince] AS [StateProvince], 
        [Extent1].[Country] AS [Country], 
        [Extent1].[State] AS [State], 
        [Extent1].[startPopupChecked] AS [startPopupChecked], 
        [Extent1].[DateAdded] AS [DateAdded], 
        [Extent1].[CurrentPortfolioId] AS [CurrentPortfolioId], 
        [Extent1].[NotificationsEmailAddress] AS [NotificationsEmailAddress], 
        [Extent1].[NotificationMobileNumber] AS [NotificationMobileNumber], 
        [Extent1].[ReceivesEmailNotifications] AS [ReceivesEmailNotifications], 
        [Extent1].[ReceivesTextNotifications] AS [ReceivesTextNotifications], 
        [Extent1].[IsActive] AS [IsActive], 
        [Extent1].[HasSeen] AS [HasSeen], 
        [Extent1].[Email] AS [Email], 
        [Extent1].[EmailConfirmed] AS [EmailConfirmed], 
        [Extent1].[PasswordHash] AS [PasswordHash], 
        [Extent1].[SecurityStamp] AS [SecurityStamp], 
        [Extent1].[PhoneNumber] AS [PhoneNumber], 
        [Extent1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
        [Extent1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
        [Extent1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
        [Extent1].[LockoutEnabled] AS [LockoutEnabled], 
        [Extent1].[AccessFailedCount] AS [AccessFailedCount], 
        [Extent1].[UserName] AS [UserName], 
        [Extent1].[BlockOrder_BlockOrderId] AS [BlockOrder_BlockOrderId]
        FROM [dbo].[AspNetUsers] AS [Extent1]
        WHERE [Extent1].[Id] = @p__linq__0 ) AS [Limit1]
    LEFT OUTER JOIN [dbo].[AspNetUserRoles] AS [Extent2] ON [Limit1].[Id] = [Extent2].[UserId]
)  AS [Project2]
ORDER BY [Project2].[Id] ASC, [Project2].[C1] ASC',N'@p__linq__0 int',@p__linq__0=346
以及每个用户的一个:

SELECT TOP (1) 
[Extent1].[BrokerId] AS [BrokerId], 
[Extent1].[Name] AS [Name], 
[Extent1].[Code] AS [Code], 
[Extent1].[IsExternal] AS [IsExternal]
FROM [dbo].[Brokers] AS [Extent1]
WHERE [Extent1].[BrokerId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=2
SELECT 
[Project2].[Id] AS [Id], 
[Project2].[ReferralId] AS [ReferralId], 
[Project2].[FirstName] AS [FirstName], 
[Project2].[LastName] AS [LastName], 
[Project2].[Address] AS [Address], 
[Project2].[Address2] AS [Address2], 
[Project2].[Zip] AS [Zip], 
[Project2].[City] AS [City], 
[Project2].[StateProvince] AS [StateProvince], 
[Project2].[Country] AS [Country], 
[Project2].[State] AS [State], 
[Project2].[startPopupChecked] AS [startPopupChecked], 
[Project2].[DateAdded] AS [DateAdded], 
[Project2].[CurrentPortfolioId] AS [CurrentPortfolioId], 
[Project2].[NotificationsEmailAddress] AS [NotificationsEmailAddress], 
[Project2].[NotificationMobileNumber] AS [NotificationMobileNumber], 
[Project2].[ReceivesEmailNotifications] AS [ReceivesEmailNotifications], 
[Project2].[ReceivesTextNotifications] AS [ReceivesTextNotifications], 
[Project2].[IsActive] AS [IsActive], 
[Project2].[HasSeen] AS [HasSeen], 
[Project2].[Email] AS [Email], 
[Project2].[EmailConfirmed] AS [EmailConfirmed], 
[Project2].[PasswordHash] AS [PasswordHash], 
[Project2].[SecurityStamp] AS [SecurityStamp], 
[Project2].[PhoneNumber] AS [PhoneNumber], 
[Project2].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
[Project2].[TwoFactorEnabled] AS [TwoFactorEnabled], 
[Project2].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
[Project2].[LockoutEnabled] AS [LockoutEnabled], 
[Project2].[AccessFailedCount] AS [AccessFailedCount], 
[Project2].[UserName] AS [UserName], 
[Project2].[BlockOrder_BlockOrderId] AS [BlockOrder_BlockOrderId], 
[Project2].[C1] AS [C1], 
[Project2].[UserId] AS [UserId], 
[Project2].[RoleId] AS [RoleId]
FROM ( SELECT 
    [Limit1].[Id] AS [Id], 
    [Limit1].[ReferralId] AS [ReferralId], 
    [Limit1].[FirstName] AS [FirstName], 
    [Limit1].[LastName] AS [LastName], 
    [Limit1].[Address] AS [Address], 
    [Limit1].[Address2] AS [Address2], 
    [Limit1].[Zip] AS [Zip], 
    [Limit1].[City] AS [City], 
    [Limit1].[StateProvince] AS [StateProvince], 
    [Limit1].[Country] AS [Country], 
    [Limit1].[State] AS [State], 
    [Limit1].[startPopupChecked] AS [startPopupChecked], 
    [Limit1].[DateAdded] AS [DateAdded], 
    [Limit1].[CurrentPortfolioId] AS [CurrentPortfolioId], 
    [Limit1].[NotificationsEmailAddress] AS [NotificationsEmailAddress], 
    [Limit1].[NotificationMobileNumber] AS [NotificationMobileNumber], 
    [Limit1].[ReceivesEmailNotifications] AS [ReceivesEmailNotifications], 
    [Limit1].[ReceivesTextNotifications] AS [ReceivesTextNotifications], 
    [Limit1].[IsActive] AS [IsActive], 
    [Limit1].[HasSeen] AS [HasSeen], 
    [Limit1].[Email] AS [Email], 
    [Limit1].[EmailConfirmed] AS [EmailConfirmed], 
    [Limit1].[PasswordHash] AS [PasswordHash], 
    [Limit1].[SecurityStamp] AS [SecurityStamp], 
    [Limit1].[PhoneNumber] AS [PhoneNumber], 
    [Limit1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
    [Limit1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
    [Limit1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
    [Limit1].[LockoutEnabled] AS [LockoutEnabled], 
    [Limit1].[AccessFailedCount] AS [AccessFailedCount], 
    [Limit1].[UserName] AS [UserName], 
    [Limit1].[BlockOrder_BlockOrderId] AS [BlockOrder_BlockOrderId], 
    [Extent2].[UserId] AS [UserId], 
    [Extent2].[RoleId] AS [RoleId], 
    CASE WHEN ([Extent2].[UserId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
    FROM   (SELECT TOP (1) 
        [Extent1].[Id] AS [Id], 
        [Extent1].[ReferralId] AS [ReferralId], 
        [Extent1].[FirstName] AS [FirstName], 
        [Extent1].[LastName] AS [LastName], 
        [Extent1].[Address] AS [Address], 
        [Extent1].[Address2] AS [Address2], 
        [Extent1].[Zip] AS [Zip], 
        [Extent1].[City] AS [City], 
        [Extent1].[StateProvince] AS [StateProvince], 
        [Extent1].[Country] AS [Country], 
        [Extent1].[State] AS [State], 
        [Extent1].[startPopupChecked] AS [startPopupChecked], 
        [Extent1].[DateAdded] AS [DateAdded], 
        [Extent1].[CurrentPortfolioId] AS [CurrentPortfolioId], 
        [Extent1].[NotificationsEmailAddress] AS [NotificationsEmailAddress], 
        [Extent1].[NotificationMobileNumber] AS [NotificationMobileNumber], 
        [Extent1].[ReceivesEmailNotifications] AS [ReceivesEmailNotifications], 
        [Extent1].[ReceivesTextNotifications] AS [ReceivesTextNotifications], 
        [Extent1].[IsActive] AS [IsActive], 
        [Extent1].[HasSeen] AS [HasSeen], 
        [Extent1].[Email] AS [Email], 
        [Extent1].[EmailConfirmed] AS [EmailConfirmed], 
        [Extent1].[PasswordHash] AS [PasswordHash], 
        [Extent1].[SecurityStamp] AS [SecurityStamp], 
        [Extent1].[PhoneNumber] AS [PhoneNumber], 
        [Extent1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
        [Extent1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
        [Extent1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
        [Extent1].[LockoutEnabled] AS [LockoutEnabled], 
        [Extent1].[AccessFailedCount] AS [AccessFailedCount], 
        [Extent1].[UserName] AS [UserName], 
        [Extent1].[BlockOrder_BlockOrderId] AS [BlockOrder_BlockOrderId]
        FROM [dbo].[AspNetUsers] AS [Extent1]
        WHERE [Extent1].[Id] = @p__linq__0 ) AS [Limit1]
    LEFT OUTER JOIN [dbo].[AspNetUserRoles] AS [Extent2] ON [Limit1].[Id] = [Extent2].[UserId]
)  AS [Project2]
ORDER BY [Project2].[Id] ASC, [Project2].[C1] ASC',N'@p__linq__0 int',@p__linq__0=346
这是因为你最有可能做的组合;实体框架没有执行查询,启用了延迟加载(我建议您关闭),并在循环中访问导航属性

未执行查询:

var nonexecuted = _context.Users.OrderBy(u => u.UserName)           
    .Include(u => u.Accounts.Select(a => a.Broker))
    .Include(u => u.Roles);
已执行的查询:

var executed = _context.Users.OrderBy(u => u.UserName)           
    .Include(u => u.Accounts.Select(a => a.Broker))
    .Include(u => u.Roles)
    .ToList() // .AsEnumerable() etc...
如果执行以下操作,则使用未执行的查询:

var maxIndex = 4;
for(idx = 0; idx < maxIndex; idx ++)
{
  nonexecuted.Users.Skip(idx).Accounts.First()
}
var maxIndex=4;
对于(idx=0;idx
将执行对
maxIndex
次的查询,因为它是延迟加载导航属性的

我强烈建议禁用懒散加载。它将迫使您创建只需要所需内容的好查询


.

您可以使用
.FromSql
并传入所需的查询。或者可以使用封装查询的视图(当然,除非使用EF Core)


老实说,如果性能是一个问题,你最好使用类似或的东西。即使是基本的积垢操作

我无法删除这个问题,即使从长远来看这实际上不是问题。。。我仍然有一些代码,从我工作的时候,它做单独的查询和填充这些字段的一些。。。当我去掉那个密码的时候。。。以下查询运行速度非常快(2秒):

public可查询的查询列表()
{
return _context.Users.OrderBy(u=>u.UserName)
.包括(u=>u.Accounts.选择(a=>a.Broker))
.包括(u=>u.Roles);
}

您是否尝试过在原始查询中包含过滤器,如
Where Role.Id==1
?“每个用户一个..每个用户一个”-我无法帮助您修复,但我可以告诉您这是一个,这是ORMSD中的一个非常常见的问题,只执行本机SQL查询并手动将其转换为对象是否有意义?是否可以将
.Include(u=>u.Accounts.Select(a=>a.Broker))
更改为
.Include(u=>u.Accounts.Include(a=>a.Broker))
?如果单独加载每个集合,启用更改跟踪后,EF将修复关系。实际上SQL查询根本不需要时间。。。不到一秒钟。。。实体框架查询需要花费大量时间。除非我弄错了,否则您的查询不会加载或进行任何调用,因为您没有
.ToList()
.AsEnumerable()
,您只是创建了一个可执行的
表达式
。实际上不太担心roleid==1。。。但我最终想要的是一个包含User.Accounts和User.Account[0..n].Broker和User.Roles的用户对象列表。@BrianRice出于兴趣,如果你
,你的queryableUserList方法需要多长时间。包括(u=>u.Accounts.Broker)
而不是
。包括(u=>u.Accounts.Select(a=>a.Broker))