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))
?