实体框架:如何减少数据库命中
本文关键字:数据库 何减少 框架 实体 | 更新日期: 2023-09-27 18:09:52
所以我在我的存储库中有这个查询(也使用工作单元模式),它使用急切加载来对数据库进行一次命中:
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等),然后映射到我的平面视图模型所需的属性,但当我这样做似乎只是懒惰加载对象,然后我有额外的命中数据库。
或者我有这个错误,每当我需要返回层次数据,我应该通过我的LINQ查询返回它在选择部分?
我的基本目标是减少对数据库的访问。
我真的不明白这个问题。你返回你的Games对象,你可以访问它的属性和子对象。您使用的Include()
方法告诉它加载您需要的内容,而不是惰性加载。
确保通过. first, . firstordefault, . single, . singleordefault或类似的方法返回单个对象
我结束了这个查询(供参考,我使用System.Data.Objects命名空间的Include扩展):
(from g in _context.Games.Include(pg => pg.PreviousGame.GameObjects.Select(o => o.Object.Video))
.Include(go => go.GameObjects.Select(o => o.Object.Video))
where EntityFunctions.DiffMilliseconds(DateTime.Now, g.EndDate) > 0
&& g.GameTypeId == (int)GameTypes.Lottery
&& g.GameStatusId == (int)GameStatues.Open
select g).FirstOrDefault();
我想我只是需要包含更多的层次结构,不知道我可以在include()函数中使用Select() !