正如主题所说,我想知道什么是更快更好的方法。
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; }
}
我不知道在我的项目中使用什么方法。
答案 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
延迟加载是一项功能,您可以在需要时加载导航,如果使用普通查询,则最终会有其他代码重新连接所有对象。