我有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();
}
但是,查询执行非常慢。我删除了FullName = STUser.HRPerson.LastName,
行,它的执行速度非常快。Join
子句减慢了速度。
我为列表中的每一行运行了SQL事件探查器,看起来它执行了700次查询。
请帮助我。
我想分享一个想法:(我不熟悉该平台)
这怎么办:
public virtual IEnumerable<YourDataObject> GetAll()
{
var result = from STUser in unitOfWork.Repository<STUser>().GetAll() // << what is GetAll()??
orderby STUser.ID
select new YourDataObject // <-- you should create a data holder class for it
{
STUser.ID,
FullName = STUser.HRPerson.LastName,
STUser.USR,
STUser.Active,
STUser.TryCount,
STUser.Description
});
return result;
}
通过在创建数据持有者类之前进行排序,您可能在数据库端使用优化。
您可以尝试在查询中使用.AsNoTracking()。
从Microsoft文档-
在只读方案中使用结果时,没有跟踪查询很有用。由于不需要设置更改跟踪信息,因此执行起来更快。如果您不需要更新从数据库中检索到的实体,则应使用无跟踪查询。您可以将单个查询交换为无跟踪。
此处有更多-https://docs.microsoft.com/en-us/ef/core/querying/tracking