实体框架:如何减少数据库命中?

时间:2011-09-25 20:14:11

标签: c# asp.net-mvc linq asp.net-mvc-3 entity-framework

所以我在我的存储库(也使用工作单元模式)中有这个查询,它使用预先加载来对数据库进行一次点击:

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查询返回它?

我的基本目标是减少对数据库的命中。

2 个答案:

答案 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()!