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();