延迟加载还是 linq 查询?

kry*_*pru 6 c# linq asp.net-mvc entity-framework

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

Linq 和存储库中的新方法,如 GetCourts(int ClubId)

var courts =_context.Courts.Where(c=>c.ClubId==clubId)
Run Code Online (Sandbox Code Playgroud)

或者使用 EF 延迟加载

var courts= _clubRepository.GetClub(clubId).Courts;
Run Code Online (Sandbox Code Playgroud)

我的俱乐部实体:

public class Club :EntityBase
    {
        public string Name { get; set; }
        public virtual IList<Court> Courts { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

我的法院实体:

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; }
    }
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*ble 6

在您在问题中描述的用例中,使用 LINQ 查询比使用延迟加载要快得多。

这个说法:

var courts= _clubRepository.GetClub(clubId).Courts;
Run Code Online (Sandbox Code Playgroud)

等价于这些语句:

var club = _clubRepository.GetClub(clubId);
var courts = club.Courts;
Run Code Online (Sandbox Code Playgroud)

第一行导致发出 SQL 查询以获取带有 的单个俱乐部ClubId == clubId。第二行导致发出另一个 SQL 查询来获取所有带有 的法院ClubId == clubId。您进行两个查询的事实将压倒延迟加载使用sp_executesql.

另一方面,

var courts =_context.Courts.Where(c=>c.ClubId==clubId)
Run Code Online (Sandbox Code Playgroud)

将会导致只发出一个 SQL 查询,这会更加高效。

当然,如果Club内存中已经有一个实例,则应该使用延迟加载来获取其相关实体,这既是为了提高效率,也是为了保持对象图的一致性。