【问题标题】:Relationship async load Entity Framework关系异步加载实体框架
【发布时间】:2015-03-26 09:15:39
【问题描述】:

我有这两个类:

部门

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

发帖

public string Id{ get; set; }
public string Name { get; set; }
public string DepartmentId { get; set; }
public virtual Department Department { get; set; }

我正在尝试加载department

var dep = await _db.Departments.FindAsync("someid");

现在我想用异步获取第一个项目:

var post = await dep.FirstAsync(s=>s.Name==name);

FirstAsync 不存在?

我遇到的第二个问题是实现自定义身份,并尝试使用FindAsync 加载用户,但它不存在。我用的是:var user = await _db.Users.FindAsync(User.Identity.GetUserId()),它不包含FindAsync函数,但存在FirstAsyncFind

【问题讨论】:

  • 我不明白您为什么需要 FirstAsync 方法。当您将 FindAsync() 分配给 dep 变量时,您正在等待它的结果。您可以只使用同步的 First()。
  • 但是在界面中我已经异步加载了一些元素,加载动画,它的简单示例,我需要什么

标签: c# entity-framework asynchronous asp.net-identity


【解决方案1】:

您不能使用第二个 FirstAsync,因为您的对象是一个部门。您的第一条语句等待 FindAsync 方法。 FindAsync 方法启动 Task 类型的任务。如果您等待该任务,则会产生一个部门。因此,您可能想为您的第一条语句指定一个确切的类型以澄清这一点:

Department dep = await _db.Departments.FindAsync("someid");

FirstAsync 是 IQueryables 的一种方法。您的部门不是 IQueryable,因此您无法使用它。如果您想要一个帖子(您的部门班级有许多不同的集合的图像),您将特别需要参考 Posts 集合。但是 Posts 集合没有异步方法。您可以使用 .AsQueryable() 方法将其转换为可查询,然后使用 FindAsync。

但是,如果您只对帖子感兴趣,您也可以在单个 LINQ 查询中编写它并让数据库找到相关项目:

string postName = "...";
string depId = "..."";

var postQuery =
    from post in _db.Posts
    where post.Name == postName && post.Department.Id == depId
    select post;

var post = postQuery.FirstAsync();

【讨论】:

    猜你喜欢
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    相关资源
    最近更新 更多