查找并包含EF 6

gra*_*der 8 entity-framework

虽然如此,但我对第一个并不感兴趣.

Customer foundCustomer = context.Set<Customer>().Include(e => e.Orders.Select ( d => d.OrderLines)).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

这很有效,我找到了我正在努力的比赛.

string custKey = "VINET";

Customer foundCustomer = context.Set<Customer>().Include(e => e.Orders.Select(d => d.OrderLines)).Where(c => c.CustomerID.Equals(custKey, StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

这工作,并按我的意愿读取数据库,但没有我想要的包含.

Customer foundCustomer = context.Set<Customer>().Find(custKey);
Run Code Online (Sandbox Code Playgroud)

这不起作用....但是我实际上是在追求

Customer foundCustomer = context.Set<Customer>().Include(e => e.Orders.Select(d => d.OrderLines)).Find(custKey);
Run Code Online (Sandbox Code Playgroud)

有什么方法结合起来Include()使用Find()

这是上下文.典型的Northwind Customer/Order(s)/ OrderDetails方案.

public partial class WindyContext : DbContext
{
    static WindyContext()
    {
        //Database.SetInitializer<WindyContext>(null);
    }

    public WindyContext()
        : base("Name=NorthwindContext")
    {
    }

    public DbSet<Customer> Customers { get; set; }
    public DbSet<OrderLine> DbSetOrderLines { get; set; }
    public DbSet<Order> Orders { get; set; }
    public DbSet<Product> Products { get; set; }


    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new CustomerMap());
        modelBuilder.Configurations.Add(new OrderLineMap());
        modelBuilder.Configurations.Add(new OrderMap());
        modelBuilder.Configurations.Add(new ProductMap());
    }
}
Run Code Online (Sandbox Code Playgroud)

luk*_*san 8

不,没有这样的运气.我不知道为什么Find()方法没有接受急于负载路径列表中的过载,但也可能是因为它试图通过先看着已经被加载到上下文中的实体是有效的.

你最好的选择是第二个例子,但你可以通过将条件直接放入FirstOrDefault()调用中来清理它:

Customer foundCustomer = context.Set<Customer>()
    .Include(e => e.Orders.Select(d => d.OrderLines))
    .FirstOrDefault(c => c.CustomerID.Equals(custKey, StringComparison.OrdinalIgnoreCase));
Run Code Online (Sandbox Code Playgroud)

如果您的数据库/列排序规则已设置为不区分大小写,您也可以使用==而不是Equals().

  • 您也可以使用`=`,因为数据库排序规则总是取代比较. (4认同)