2017-07-31 81 views
4

我有这些领域模型实体框架 - 延迟加载或额外的异步/等待查询方法?

public class Topic 
{ 
    public int TopicId { get; set; } 

    public virtual ICollection<Post> Posts { get; set; } 
} 

public class Post 
{ 
    public int PostId { get; set; } 

    public int? TopicId { get; set; } 
    public virtual Topic Topic { get; set; } 
} 

比如我想impliment方法TestAsync,还有我想Topic对象和相关文章的对象打交道。

主题模型我可以使用async方法和topicId作为参数。

public async Task<bool> TestAsync(int topicId) 
{ 
    var topic = await topicService.GetByIdAsync(topicId); 

    // posts ... 
} 

我有两种方法,如何获得相关的帖子。 但是,如果我将使用LazyLoading或另一个异步查询,有什么区别?

// Example: 1 (LazyLoading) 
var posts = topic.Posts; 

// OR Example: 2 (Async method) 
var posts = await postService.GetAllByTopicIdAsync(topicId); 

所以,我认为示例:1将同步工作,并且我也失去了异步/等待代码的所有优点。 但是,例如:2让我想,这可能是我不知道所有魅力的懒惰加载:) 任何人都可以澄清我应该使用什么解决方案,为什么?谢谢:)

+0

在ASP.NET中用于数据库访问的async/await代码的“优点”非常少。 –

+0

它不是async/await或懒加载imho之间的选择。这是向数据库发出两个查询(使用延迟加载)或在sql中加入连接(使用Include进行加载加载)之间的选择。 –

+0

David,但是在许多文章中,async/await建议使用它来处理与数据库一起工作的方法,因为此时线程返回到线程池。 Peter,Eager Loading可以是一个解决方案,谢谢! –

回答

6

延迟加载始终是同步的,这是不幸的。例如,EF Core以其异步优先思路,并不支持延迟加载。

其他选项是按Peter的建议做一个连接(加载),它会异步执行单个查询;或者执行显式的第二个异步查询。你会选择哪一个归结为你的模型通常如何使用。

就我个人而言,如果模型总是一起使用,我会选择进行急切的加载,否则会执行多个异步查询。我自己并不使用懒加载,尽管没有任何东西阻止它的工作。

+0

感谢您的广泛咨询。它帮助了我。感谢Peter也是:) –

-1

你不应该这样做。我假设你的GetByIdAsync()是这样实现的。

public async Task<Topic> GetByIdAsync(int id) 
{ 
     return await context.Topics.FirstAsync(t=>t.Id == id); 
} 

你应该改变它是

public async Task<Topic> GetByIdAsync(int id) 
{ 
     return await context.Topics.Include(t=>t.Posts).FirstAsync(t=>t.Id == id); 
} 
+0

你不能推荐这个,因为你不知道内部,也许主题包含成千上万的记录和帖子很少使用,那么这个解决方案是最无效的。 – Gusman

+0

或者,也可以向GetByIdAsyc添加一个参数,以请求加载帖子。 –

+0

@Gusman这就是为什么我说“假设”。无论如何,主题中的行数如何影响此解决方案?我好奇。 –