所以我有这个疑问在我的仓库(也使用工作模式的单位),使用预先加载,使一重击数据库:实体框架:如何减少数据库命中?
from g in _context.Games.Include(pg => pg.PreviousGame).Include(go => go.GameObjects)
where EntityFunctions.DiffMilliseconds(DateTime.Now, g.EndDate) > 0
&& g.GameTypeId == (int)GameTypes.Lottery
&& g.GameStatusId == (int)GameStatues.Open
select new LotteryModel
{
EndDate = g.EndDate,
GameId = g.Id,
PreviousGameEndDate = g.PreviousGame.EndDate,
PreviousGameId = g.PreviousGameId.HasValue ? g.PreviousGameId.Value : 0,
PreviousGameStartDate = g.PreviousGame.StartDate,
PreviousWinningObjectCount = g.PreviousGame.GameObjects.Select(go => go.Object.Count).FirstOrDefault(),
PreviousWinningObjectExternalVideoId = g.PreviousGame.GameObjects.Select(go => go.Object.Video.ExternalVideoId).FirstOrDefault(),
PreviousWinningObjectName = g.PreviousGame.GameObjects.Select(go => go.Object.Video.Name).FirstOrDefault(),
StartDate = g.StartDate,
WinningObjectCount = g.GameObjects.Select(go => go.Object.Count).FirstOrDefault(),
WinningObjectExternalVideoId = g.GameObjects.Select(go => go.Object.Video.ExternalVideoId).FirstOrDefault(),
WinningObjectName = g.GameObjects.Select(go => go.Object.Video.Name).FirstOrDefault()
};
但是我不愿意用这个,因为我现在已经创建一个单独的LotteryModel对象,以便在我的其他图层中返回。
我希望能够将包含所有导航方法的“游戏”类型的实体返回给我的所有其他数据(PreviousGame,GameObjects等),然后将所需属性映射到我的平面视图模型,但是当我这样做时,它似乎只是懒惰地加载对象,然后我有额外的命中数据库。
或者我有这个错误,每当我需要返回heirarchical数据,我应该通过我的LINQ查询在选择部分返回它?
我的基本目标是减少对数据库的命中。
对于你的问题不是一个真正的答案,但是当我遇到这种情况时,我总是继续写一个T-sql来在我的数据库上创建一个视图。然后,我找回来。这使我能够访问数据库一次,并且还可以为我的视图创建索引。复杂的查询在linq IMO上造成混乱。 – tugberk
谢谢你的回答..我同意你的意见。我想我可能会离开我所拥有的东西,因为它只会触及DB一次..或者在一个工作单元中将查询拆分成多个quieries ..但是我不确定这是否会因为.Firsts()我有.. – Ryan
您的查询不使用急切的加载。它使用投影。急切的加载不会将数据投影到另一个类。 –