所以我在我的存储库(也使用工作单元模式)中有这个查询,它使用预先加载来对数据库进行一次点击:
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对象以在我的其他层中返回。
我希望能够返回一个类型为“Game”的实体,它将所有导航方法都包含在我的所有其他数据(PreviousGame,GameObjects等)中,然后将所需的属性映射到我的平面视图模型,但是,当我这样做时,它似乎只是懒惰加载对象,然后我有额外的命中数据库。
或者我是否有这个错误,每当我需要返回heirarchical数据时,我应该通过选择部分中的LINQ查询返回它?
我的基本目标是减少对数据库的命中。
答案 0 :(得分:3)
我真的不明白这个问题。您返回Games对象,您可以访问它的属性和子对象。您对Include()
方法的使用告诉它加载您需要的内容,而不是延迟加载它。
确保通过.First,.FirstOrDefault,.Single,.SingleOrDefault或类似方法返回单个对象。
答案 1 :(得分:0)
我最终得到了这个查询(仅供参考我使用Include扩展名的System.Data.Objects命名空间):
(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();
我想我只需要包含更多的heirarchy,并且不知道我可以在Include()函数中使用Select()!