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();
}
还不错-仍然只是对数据库的两个查询。返回了什么异常?尝试查看它提供了有关该类型筛选器的一些信息返回了什么异常?尝试查看它提供了有关该类型筛选器的一些信息