【发布时间】:2020-04-15 22:55:40
【问题描述】:
我有 700 条记录,它们有不同的列,类型为字符串,我想使用此代码选择所有记录:
public virtual object GetAll()
{
var AllList = unitOfWork.Repository<STUser>().GetAll().ToList();
return (from STUser in AllList
select new
{
STUser.ID,
FullName = STUser.HRPerson.LastName,
STUser.USR,
STUser.Active,
STUser.TryCount,
STUser.Description
}).OrderByDescending(i => i.ID).ToList();
}
不过,unitl Fill "var AllList" 很好但是当Linq 查询执行时很慢。
我删除了FullName = STUser.HRPerson.LastName, 行,它执行得非常快。
Join 子句减慢了速度。
我为列表中的每一行运行 SQL 分析器,看起来它执行了 700 次查询。 查询是
exec sp_executesql N'SELECT
[Extent1].[ID] AS [ID],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[LastName] AS [LastName],
[Extent1].[EnFullName] AS [EnFullName],
[Extent1].[FatherName] AS [FatherName],
[Extent1].[GenderID] AS [GenderID],
[Extent1].[NationalCode] AS [NationalCode],
[Extent1].[IdentityNumber] AS [IdentityNumber],
[Extent1].[BirthCityID] AS [BirthCityID],
[Extent1].[BirthDate] AS [BirthDate],
[Extent1].[VeteranID] AS [VeteranID],
[Extent1].[PersonPic] AS [PersonPic],
[Extent1].[Active] AS [Active],
[Extent1].[Description] AS [Description],
[Extent1].[DateTimes] AS [DateTimes]
FROM [dbo].[HRPerson] AS [Extent1]
WHERE [Extent1].[ID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1502
请帮帮我。
【问题讨论】:
-
这就是延迟加载的效果,您可能想要 Eager - 请参阅 docs.microsoft.com/en-us/ef/ef6/querying/related-data
-
@HansKesting when 执行查询完全不会影响查询的duration。但是,一次又一次地执行相同的查询是另一个问题,确实会影响性能。
-
不使用
.ToList()上的var AllList = unitOfWork.Repository<STUser>().GetAll().ToList();怎么办 -
您是否对此进行了分析,例如使用 DotTrace?您的性能瓶颈到底在哪里?您可能在这里查看错误的代码。从你发布的内容来看,我们在这里没什么可做的。
-
尝试将
.GetAll().ToList()更改为.GetAll().Include(u => u.HRPerson).ToList(),以在获取所有用户的同时尝试并急切地获取该 hrperson,而不是作为单独的查询(我假设正在发生)