延迟加载或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查询

在你的问题中描述的用例中,使用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

延迟加载是一个功能,你可以在需要的时候加载导航,如果你使用普通的查询,你最终会有额外的代码来重新连接所有的对象。