2011-09-25 85 views
0

所以我有这个疑问在我的仓库(也使用工作模式的单位),使用预先加载,使一重击数据库:实体框架:如何减少数据库命中?

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查询在选择部分返回它?

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

+3

对于你的问题不是一个真正的答案,但是当我遇到这种情况时,我总是继续写一个T-sql来在我的数据库上创建一个视图。然后,我找回来。这使我能够访问数据库一次,并且还可以为我的视图创建索引。复杂的查询在linq IMO上造成混乱。 – tugberk

+0

谢谢你的回答..我同意你的意见。我想我可能会离开我所拥有的东西,因为它只会触及DB一次..或者在一个工作单元中将查询拆分成多个quieries ..但是我不确定这是否会因为.Firsts()我有.. – Ryan

+0

您的查询不使用急切的加载。它使用投影。急切的加载不会将数据投影到另一个类。 –

回答

3

我真的不明白这个问题。你返回你的游戏对象,你可以访问它的属性和子对象。你使用Include()方法告诉它加载你所需要的,而不是懒加载它。

确保您通过.First,.FirstOrDefault,.Single,.SingleOrDefault或类似方法返回单个对象。

+0

你的答案导致我最终的答案,谢谢 – Ryan

0

我结束了与此查询(仅供参考我使用的是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(); 

我想我只是需要包括更多的层次结构和没”我知道我可以在Include()函数中使用Select()!