延迟加载或linq查询?

时间:2014-08-23 15:40:17

标签: c# asp.net-mvc linq entity-framework

正如主题所说,我想知道什么是更快更好的方法。

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; }
    }

我不知道在我的项目中使用什么方法。

2 个答案:

答案 0 :(得分:4)

在您在问题中描述的用例中,使用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的实例,你应该使用延迟加载来获取其相关实体,以提高效率并保持对象图的一致性。

答案 1 :(得分:3)

延迟加载会将查询包装在sp_executesql中,而使用普通的linq查询时,它会直接发送t-sql语句。

并且msdn声明sp_executesql将重用现有的执行计划,这意味着如果应用程序发送后续查询,它有助于减少开销。

  

使用sp_executesql可以帮助减少这种开销,但仍然允许使用SQL   服务器重用执行计划。可以使用sp_executesql代替   执行Transact-SQL语句时的存储过程   次,当唯一的变化是在提供给的参数值时   Transact-SQL语句。因为Transact-SQL语句   它们本身保持不变,只有参数值发生变化   SQL Server查询优化器很可能会重用它的执行计划   生成第一次执行。 - MSDN

延迟加载是一项功能,您可以在需要时加载导航,如果使用普通查询,则最终会有其他代码重新连接所有对象。