C# 在具有多个Include的linq查询上的.Include()中使用.Where()子句

C# 在具有多个Include的linq查询上的.Include()中使用.Where()子句,c#,linq-to-entities,where,C#,Linq To Entities,Where,我希望获得一个客户集合,包括几个属性,其中包括地址,但仅当它尚未被删除时(SuppressionDate==null) 这是我第一次尝试,但引发了以下异常: System.ArgumentException:包含路径表达式必须引用 在类型上定义的导航属性。使用虚线路径 引用导航属性和集合的选择运算符 导航属性。参数名称:路径 我也尝试过在Include()的末尾和查询的末尾使用相同的where子句,但这两个子句似乎都不起作用 我目前正在使用一种变通方法,即迭代客户集合并删除已删除的地址,如下所示

我希望获得一个客户集合,包括几个属性,其中包括地址,但仅当它尚未被删除时(
SuppressionDate==null

这是我第一次尝试,但引发了以下异常:

System.ArgumentException:包含路径表达式必须引用 在类型上定义的导航属性。使用虚线路径 引用导航属性和集合的选择运算符 导航属性。参数名称:路径

我也尝试过在
Include()
的末尾和查询的末尾使用相同的where子句,但这两个子句似乎都不起作用

我目前正在使用一种变通方法,即迭代客户集合并删除已删除的地址,如下所示:

foreach(Customer c in customers){
    customer.Addresses = customer.Addresses.Where(a => a.SuppressionDate == null).ToList();
}

作为linq的新手,我想知道是否有一种内置的方法可以实现这一点。

如果您只获得一个客户,您可以像这样使用显式加载:

var customer = context.Persons
    .OfType<Customer>()
    .Include(customer => customer.Bills)
    .Include(customer => customer.Code)
    .Include(customer => customer.Tutors)
    .FirstOrDefault(); //or whatever

context.Entry(customer).Collections(x => x.Addresses).Query().Where(x => x.SuppressionDate == null).Load();
var customer=context.Persons
第()类
.Include(客户=>customer.Bills)
.Include(customer=>customer.Code)
.Include(客户=>customer.Tutors)
.FirstOrDefault()//或者别的什么
context.Entry(customer).Collections(x=>x.Addresses).Query().Where(x=>x.SuppressionDate==null).Load();
这是一个很好的查询和对数据库的两个简单调用。但在这种情况下,您将获得一个客户列表(或集合或其他),没有捷径。您的“变通方法”可能会引起数据库的大量问题

因此,您可能只需一步一个脚印:

//1. query db to get customers
var customers = context.Persons
    .OfType<Customer>()
    .Include(customer => customer.Bills)
    .Include(customer => customer.Code)
    .Include(customer => customer.Tutors)
    .ToList();

//2. make an array of all customerIds (no db interation here)
var customerIds = customers.Select(x => x.CustomerId).ToArray();

//3. query db to get addresses for customers above
var addresses = context.Addresses.Where(x => customerIds.Contains(x.CustomerId).ToList();

//4. assign addresses to customers (again, no db chatter)
foreach (var customer in customers) 
{
    customer.Addresses = addresses
        .Where(x => x.CustomerId == customer.CustomerId && x.SuppressionDate == null)
        .ToList();
}
//1。查询数据库以获取客户
var customers=context.Persons
第()类
.Include(客户=>customer.Bills)
.Include(customer=>customer.Code)
.Include(客户=>customer.Tutors)
.ToList();
//2. 创建一个包含所有CustomerID的数组(此处没有db交互)
var customerIds=customers.Select(x=>x.CustomerId.ToArray();
//3. 查询数据库以获取上述客户的地址
var addresses=context.addresses.Where(x=>customerIds.Contains(x.CustomerId.ToList();
//4.为客户分配地址(同样,没有数据库聊天)
foreach(客户中的var客户)
{
客户地址=地址
.Where(x=>x.CustomerId==customer.CustomerId&&x.SuppressionDate==null)
.ToList();
}

还不错-仍然只有两个对数据库的查询。

如果您得到一个客户,您可以使用如下显式加载:

var customer = context.Persons
    .OfType<Customer>()
    .Include(customer => customer.Bills)
    .Include(customer => customer.Code)
    .Include(customer => customer.Tutors)
    .FirstOrDefault(); //or whatever

context.Entry(customer).Collections(x => x.Addresses).Query().Where(x => x.SuppressionDate == null).Load();
var customer=context.Persons
第()类
.Include(客户=>customer.Bills)
.Include(customer=>customer.Code)
.Include(客户=>customer.Tutors)
.FirstOrDefault();//或其他
context.Entry(customer).Collections(x=>x.Addresses).Query().Where(x=>x.SuppressionDate==null).Load();
这是一个很好的查询和对数据库的两个简单调用。但是在这种情况下,您得到的是一个客户列表(或集合或任何东西),没有快捷方式。您的“解决方法”可能会引起数据库的大量聊天

因此,您可能只需一步一个脚印:

//1. query db to get customers
var customers = context.Persons
    .OfType<Customer>()
    .Include(customer => customer.Bills)
    .Include(customer => customer.Code)
    .Include(customer => customer.Tutors)
    .ToList();

//2. make an array of all customerIds (no db interation here)
var customerIds = customers.Select(x => x.CustomerId).ToArray();

//3. query db to get addresses for customers above
var addresses = context.Addresses.Where(x => customerIds.Contains(x.CustomerId).ToList();

//4. assign addresses to customers (again, no db chatter)
foreach (var customer in customers) 
{
    customer.Addresses = addresses
        .Where(x => x.CustomerId == customer.CustomerId && x.SuppressionDate == null)
        .ToList();
}
//1.查询数据库以获取客户
var customers=context.Persons
第()类
.Include(客户=>customer.Bills)
.Include(customer=>customer.Code)
.Include(客户=>customer.Tutors)
.ToList();
//2.创建一个所有CustomerID的数组(此处没有db交互)
var customerIds=customers.Select(x=>x.CustomerId.ToArray();
//3.查询数据库以获取上述客户的地址
var addresses=context.addresses.Where(x=>customerIds.Contains(x.CustomerId.ToList();
//4.为客户分配地址(同样,没有数据库聊天)
foreach(客户中的var客户)
{
客户地址=地址
.Where(x=>x.CustomerId==customer.CustomerId&&x.SuppressionDate==null)
.ToList();
}

还不错-仍然只是对数据库的两个查询。

返回了什么异常?尝试查看它提供了有关该类型筛选器的一些信息返回了什么异常?尝试查看它提供了有关该类型筛选器的一些信息