ThenInclude对于Entity Framework LINQ查询无法正常工作

10

我有一个如下所示的数据库模型:

public class Customer
{
    public int CustomerId{ get; set; }

    public int OrderId { get; set; }
    public ICollection<Order> Orders { get; set; }
}

public class Order
{
    public int OrderId { get; set; }
    public int Amount { get; set; }

    public int ProductId { get; set; }
    public Product Product { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
}

我们有一个能够下订单的客户。这个订单包括一个产品和它的名称。现在我正在尝试使用如下的linq语句返回完整的模型:

_db.Customer.Include(c => c.Orders).ThenInclude(o => o.Product).SingleOrDefaultAsync();

但是ThenInclude(o => o.Product)不能生效,因为Orders是一个ICollection。来自德国的问候,非常感谢您的帮助。

2
ThenInclude() 是 EF Core 的一个特性,你在使用吗? - maccettura
是的,使用最新版本的EF Core和.Net Core。 - Marvin Püthe
而哪里出了问题呢?你发的那段代码应该是有效的。 - Ivan Stoev
2个回答

8
为了在EF 6中加载相关实体,您应该使用如下所示的Select方法:
_db.Customer.Include(c => c.Orders.Select(o=>o.Product)).SingleOrDefaultAsync();

ThenInclude方法是EF Core的最新版本中添加的。


“旧”的方式?OP 要么使用的是 EF6,这是唯一的方法,要么使用的是 EF Core,但这种方式根本不被支持 :) - Ivan Stoev
是的,但我认为他在使用 EF Core,这就是为什么我这样称呼的原因。 - ocuenca
那么你有一个问题,因为EF Core不支持“旧方法”。 - Ivan Stoev
好的,我会更新我的回答,谢谢@IvanStoev提供的信息。 - ocuenca
请查看 https://dev59.com/AZ3ha4cB1Zd3GeqPSlSz#41130631。注意安全。 - Ivan Stoev
显示剩余3条评论

1
也许我说错了,但你需要更改的是:
public class Order
{
    public int OrderId { get; set; }
    public int Amount { get; set; }

    public int ProductId { get; set; }
    public Product Product { get; set; }
}

to

public class Order
{
    [Key, ForeignKey("Product")]
    public int OrderId { get; set; }
    public int Amount { get; set; }

    public int ProductId { get; set; }
    public virtual Product Product { get; set; }
}

为了使其按照您期望的方式运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接