Entity framework 使用CONTAint延迟加载实体框架

Entity framework 使用CONTAint延迟加载实体框架,entity-framework,lazy-loading,Entity Framework,Lazy Loading,我想知道是否有一种方法可以在延迟加载中包含约束。我要加载的对象有一个属性“isDeleted”。我只想加载未删除的结果。比如说 allCustomers = db.customers.include("documents").toList 我希望这可以返回所有客户,并且只返回isDeleted=false的任何文档。我知道我可以在返回集上对此进行限定,但我甚至不想从数据库中获取它们。有什么办法吗?如果只想查询值,最好不要使用Include(字符串) 显然,客户与其文档之间存在一对多关系:每个客

我想知道是否有一种方法可以在延迟加载中包含约束。我要加载的对象有一个属性“isDeleted”。我只想加载未删除的结果。比如说

allCustomers = db.customers.include("documents").toList

我希望这可以返回所有客户,并且只返回isDeleted=false的任何文档。我知道我可以在返回集上对此进行限定,但我甚至不想从数据库中获取它们。有什么办法吗?

如果只想查询值,最好不要使用Include(字符串)

显然,客户与其文档之间存在一对多关系:每个
客户
都有零个或多个
文档
,每个
文档
只属于一个
客户

(或者可以是多对多关系,但原则不变。)

因此,如果您按照设计类,您可能会遇到类似的情况:

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

    // every Customer has zero or more Documents:
    public virtual ICollection<Document> Documents {get; set;}

    ... // other properties
}
class Document
{
    public int Id {get; set;}

    // every Document belongs to exactly one Customer using foreign key:
    public int CustomerId {get; set;}
    public virtual Customer Customer {get; set;}

    ... // other properties
}
因为实体框架知道您的一对多关系,所以它知道主键和外键,并将为您执行适当的连接

只有当您确实需要更新所有未删除客户的所有文档时,才明智地使用
Include
。我的建议是不要使用接受字符串参数的版本,而是使用接受属性表达式的版本。看见该版本是类型安全的。如果您使用不存在的属性,编译器将投诉:

var itemsToUpdate = myDbContext.Customers
    .Include(customer.Documents)
    .Where(customer => !customer.IsDeleted);
但我认为很少有人希望一次更新所有客户的所有文档。通常,您将更新一个文档或一个客户

因此,如果您需要更新一对一关系,您通常需要包括:一个拥有唯一家庭地址的客户

var customerToUpdate = myDbContext.Customers
   .Include(customer => customer.HomeAddress)
   .Where(customer => customer.Id == customerId)
   .SingleOrDefault();

customer.HomeAddress.Street = "Downing street",
customer.HomeAddress.Number = 10,
customer.HomeAddress.City = "London",
myDbContext.SaveChanges();

谢谢,这很有帮助。但是,isDeleted实际上在我的“Document”对象上。我想返回所有未删除的客户及其所有文档。这样您就知道该怎么做了:在客户集合a
Where(customer=>!customer.IsDeleted)
和文档集合a
Where(document=>!document.IsDeleted)
var customerToUpdate = myDbContext.Customers
   .Include(customer => customer.HomeAddress)
   .Where(customer => customer.Id == customerId)
   .SingleOrDefault();

customer.HomeAddress.Street = "Downing street",
customer.HomeAddress.Number = 10,
customer.HomeAddress.City = "London",
myDbContext.SaveChanges();