c# - Entity Framework - 延迟加载或额外的异步/等待查询方法?

标签 c# asp.net entity-framework async-await lazy-loading

我有这些领域模型

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

例如,我想实现方法 TestAsync,在那里我想使用 Topic 对象和相关的 Posts 对象。

我可以使用异步方法和 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);

因此,我认为 Example:1 将同步工作,而且我失去了异步/等待代码的所有优势。 但是示例:2 让我觉得,这可能是我不知道延迟加载的所有魅力:) 谁能阐明我应该使用什么解决方案以及为什么?谢谢:)

最佳答案

延迟加载总是同步的,这是不幸的。例如,EF Core 具有异步优先的思想,(目前)还不支持延迟加载。

其他选项是按照 Peter 的建议进行连接(预先加载),异步执行单个查询;或者进行显式的第二个异步查询。您选择哪一个取决于您的模型通常如何使用。

就个人而言,如果模型总是一起使用,我会选择进行预加载,否则进行多个异步查询。我自己不使用延迟加载,尽管没有什么可以阻止它工作。

关于c# - Entity Framework - 延迟加载或额外的异步/等待查询方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45421267/

相关文章:

c# - LINQ 表与 Entity Framework 连接

c# - 如何使用证书在 ASP.Net 中调用 soap API?

javascript - $().change 或 $().bind(change,function()) 不适用于 IE8、JQuery、Javascript

c# - 模拟高尔夫比赛策略

nhibernate - NHibernate 上关于 Entity Framework 的导航属性是否有类似的东西?

c# - 无法在 Entity Framework 中捕获 SqlException

c# - 从网络源下载字节数

c# - 针对 Excel 列循环遍历 SQL 数据库列的最快方法 - C#

c# - 使用 DataGrid 在一列中显示多个标题

asp.net-mvc - 使用 Azure Key Vault 中的列主 key 来解密始终加密的列