虽然这很有效,但我对第一个并不感兴趣。
Customer foundCustomer = context.Set<Customer>().Include(e => e.Orders.Select ( d => d.OrderLines)).FirstOrDefault();
这很有效,我找到了我正在努力的比赛。
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();
这可行,并按我的意愿读取数据库,但没有我想要的包含。
Customer foundCustomer = context.Set<Customer>().Find(custKey);
这不起作用....但是我实际上是在追求
Customer foundCustomer = context.Set<Customer>().Include(e => e.Orders.Select(d => d.OrderLines)).Find(custKey);
有没有办法将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());
}
}
答案 0 :(得分:8)
Find()
方法没有接受eager-load路径列表的重载,但可能是因为它首先查看已经加载的实体会尝试提高效率进入上下文。
你最好的选择是第二个例子,但你可以通过将条件直接放在FirstOrDefault()
电话中来清理它:
Customer foundCustomer = context.Set<Customer>()
.Include(e => e.Orders.Select(d => d.OrderLines))
.FirstOrDefault(c => c.CustomerID.Equals(custKey, StringComparison.OrdinalIgnoreCase));
如果您的数据库/列排序规则已设置为不区分大小写,则也可以使用==
而不是Equals()
。
答案 1 :(得分:3)
我不相信您在使用“查找”时可以使用“包含”。如果您希望显式加载其他实体,那么您可以尝试以下内容:
var customer = context.Customers.Include(x => x.Orders)
.Include("Orders.OrderLines")
.SingleOrDefault(x => x.CustomerID == custKey);