C# 实体框架:如何减少数据库点击?

C# 实体框架:如何减少数据库点击?,c#,asp.net-mvc,linq,asp.net-mvc-3,entity-framework,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)Game

因此,我在我的存储库中有一个查询(也使用工作单元模式),它使用渴望加载对数据库进行一次点击:

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等),然后将所需的属性映射到我的平面视图模型,但当我这样做时,似乎只会延迟加载对象,然后我会对DB进行额外的点击

或者我有错误吗?每当我需要返回Hierarchical数据时,我都应该通过select部分中的LINQ查询返回它


我的基本目标是减少对数据库的点击

我真的不明白这个问题。返回游戏对象,然后可以从中访问属性和子对象。您使用的
Include()
方法告诉它加载您需要的内容,而不是延迟加载


请确保通过.First、.FirstOrDefault、.single、.SingleOrDefault或类似方法返回单个对象。

我不太理解这个问题。返回游戏对象,然后可以从中访问属性和子对象。您使用的
Include()
方法告诉它加载您需要的内容,而不是延迟加载


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

我以此查询结束(仅供参考,我将System.Data.Objects命名空间用于Include扩展名):


我想我只是需要包含更多的继承权,不知道我可以在include()函数中使用Select()

我最终得到了这个查询(仅供参考,我将System.Data.Objects命名空间用于Include扩展):


我想我只是需要包含更多的继承权,不知道我可以在include()函数中使用Select()

这不是对您问题的真正答案,但当我遇到这种情况时,我总是继续编写一个T-sql来在我的数据库上创建一个视图。然后,我把它取回。这允许我点击数据库一次,我还可以为我的视图创建一个索引。复杂的查询会把linq IMO搞得一团糟。谢谢你的回答。。我同意你的看法。我想我要么留下我所有的,因为它只击中DB一次。。或者在一个工作单元中将查询拆分为多个静默。。但我不确定这是否会起作用,因为我有.Firsts()。您的查询不使用即时加载。它使用投影。即时加载不会将数据投影到另一个类。@Ladisalv Mrnka-是否包含()eagar加载?@Ryan-是的,但是当您进行投影时,您会失去即时加载的功能,这是您问题的真正答案,但当我遇到这种情况时,我总是继续编写t-sql来在我的数据库上创建视图。然后,我把它取回。这允许我点击数据库一次,我还可以为我的视图创建一个索引。复杂的查询会把linq IMO搞得一团糟。谢谢你的回答。。我同意你的看法。我想我要么留下我所有的,因为它只击中DB一次。。或者在一个工作单元中将查询拆分为多个静默。。但我不确定这是否会起作用,因为我有.Firsts()。您的查询不使用即时加载。它使用投影。即时加载不会将数据投影到另一个类。@Ladisalv Mrnka-是否包含()eagar加载?@Ryan-是的,但当您投影时,您将丢失即时加载。您的答案导致我最终的答案,谢谢您的答案导致我最终的答案,谢谢
(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();