延迟加载或linq查询
本文关键字:查询 linq 延迟加载 | 更新日期: 2023-09-27 18:19:09
正如主题所说,我想知道什么是更快更好的方法。
Linq和GetCourts(int clubId)等库中的新方法
var courts =_context.Courts.Where(c=>c.ClubId==clubId)
或使用EF
延迟加载var courts= _clubRepository.GetClub(clubId).Courts;
我的俱乐部实体:
public class Club :EntityBase
{
public string Name { get; set; }
public virtual IList<Court> Courts { get; set; }
}
我的法院实体:
public class Court:EntityBase
{
public bool IsIndoor { get; set; }
public int ClubId { get; set; }
public virtual Club Club { get; set; }
public int CourtTypeId { get; set; }
public virtual CourtType CourtType { get; set; }
}
我不知道在我的项目中使用什么方法
在你的问题中描述的用例中,使用LINQ查询将比使用延迟加载快得多。
这句话:
var courts= _clubRepository.GetClub(clubId).Courts;
相当于以下语句:
var club = _clubRepository.GetClub(clubId);
var courts = club.Courts;
第一行导致发出一个SQL查询,以获得具有ClubId == clubId
的单个俱乐部。第二行导致发出另一个SQL查询,以获取ClubId == clubId
的所有法院。您正在进行两个查询的事实将压倒延迟加载使用sp_executesql
的任何潜在好处。
var courts =_context.Courts.Where(c=>c.ClubId==clubId)
将导致只发出一个SQL查询,这将更加高效。
当然,如果您已经在内存中有一个Club
实例,您应该使用延迟加载来获取它的相关实体,这既提高了效率,又保持了对象图的一致性。
延迟加载将在sp_executesql
中包装查询,而使用正常的linq查询将直接发送t-sql语句。
并且msdn声明sp_executesql
将重用现有的执行计划,这意味着如果应用程序发送后续查询,它有助于减少开销。
使用sp_executesql可以帮助减少这个开销,并且仍然让SQL服务器重用执行计划。Sp_executesql可以代替执行Transact-SQL语句时的存储过程的参数值唯一变化时Transact-SQL语句。因为Transact-SQL语句本身保持不变,只有参数值改变SQL Server查询优化器很可能重用执行计划吧为第一次执行生成。——MSDN
延迟加载是一个功能,你可以在需要的时候加载导航,如果你使用普通的查询,你最终会有额外的代码来重新连接所有的对象。