我正在使用Entity Framework 5访问我的数据库。该模型非常复杂,具有许多导航属性。我已经使用linq编写了以下查询:
var myQuery =
from cp in context.ClosedPositions.Include("Position").Include("Position.Folder").Include("Position.Strategy").Include("Position.Symbol").Include("Position.StopTargetPlacer")
where cp.Position.EntryDate >= fromDT &&
cp.ExitDate <= toDT &&
(cp.Position.Folder.FolderCode == myFolder || showAllFolders) &&
(cp.Position.Strategy.Name == myStrategy || showAllStrategies) &&
(cp.Position.Symbol.Name == mySymbol || showAllSymbols) &&
(cp.Position.Symbol.Exchange == myExchange || showAllExchanges)
orderby cp.Position.EntryDate
select cp;
导航的多样性如下:
位置1-* ClosedPostion
位置*-1个文件夹
排名*-1策略
位置*-1个符号
然后在foreach查询中,我使用Included导航属性中的Data。我认为这种方式不应多次击中数据库。查询运行大约6秒钟。
然后,我将查询重写为:
var myQuery =
from cp in context.ClosedPositions
join p in context.Positions on cp.PositionID equals p.ID
join f in context.Folders on p.FolderID equals f.ID
join sy in context.Symbols on p.SymbolID equals sy.ID
join st in context.Strategies on p.StrategyID equals st.ID
join stp in context.StopTargetPlacers on p.StopTargetPlacerID equals stp.ID
where p.EntryDate >= fromDT &&
cp.ExitDate <= toDT &&
(f.FolderCode == myFolder || showAllFolders) &&
(st.Name == myStrategy || showAllStrategies) &&
(sy.Name == mySymbol || showAllSymbols) &&
(sy.Exchange == myExchange || showAllExchanges)
orderby p.EntryDate
select new
{
ClosedPositionID = cp.ID,
PositionID = p.ID,
p.EntryChartID,
cp.ExitChartID,
p.EntryDate,
cp.ExitDate,
Symbol = sy.Name,
Strategy = st.Name,
p.Size,
cp.Profit,
STPlacer = p.StopTargetPlacer.Name,
InitialRisk = p.InitialRisk,
StrategyDirection = st.Direction
};
同样,我使用了相同的foreach循环来处理数据。这次,总处理时间仅为1秒左右。
我已经检查了两个LINQ查询生成的SQL查询,它们在SSMS中运行时,它们都在相同的时间内返回了相同的数据。
我的问题是,为什么在使用匿名类和上下文模型中的类之间会有巨大的延迟?
最佳答案
我们在谈论多少条记录?
您是否在上下文级别禁用了实体跟踪?
请记住,当EF实现启用跟踪的实体时,它必须检查来自数据库的每条记录,以确保它不会再次实现同一对象。跟踪实体也更加昂贵,因为它必须注册所有实体(更多代码执行)。
当您实现匿名类型时,上下文不必担心所有这些。
关于c# - C# Entity Framework 在查询中使用模型中的类比使用匿名类慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20379823/