C# 如何将where子句添加到EF中包含的实体中?
我有三张桌子C# 如何将where子句添加到EF中包含的实体中?,c#,entity-framework,C#,Entity Framework,我有三张桌子 人员表(通用人员表) 客户表(每个客户都是一个人) 地址表(每个客户都有一个地址) 我需要从实体框架中查询数据库,以获得关于此人姓名和城市、州的匹配。这就是我所拥有的,但除非我从where条款中删除state和city,否则它不会起作用 var customer = db.tbl_Person .Include(t => t.tbl_Customer.tbl_Address) .Where(t => t.VendorID == person.Vend
- 人员表(通用人员表)
- 客户表(每个客户都是一个人)
- 地址表(每个客户都有一个地址)
var customer = db.tbl_Person
.Include(t => t.tbl_Customer.tbl_Address)
.Where(t => t.VendorID == person.VendorID &&
t.FirstName == person.FirstName &&
t.LastName == person.LastName &&
t.tbl_Customer.tbl_Address.State == address.State &&
t.tbl_Customer.tbl_Address.City == address.City).ToList();
任何帮助都将不胜感激-我对EF还是相当陌生的。正如我在下面的评论中所说,我得到的错误是
其他信息:无法强制转换类型为的对象
输入'System.Linq.Expressions.FieldExpression'
'System.Linq.Expressions.ParameterExpression'
我认为在EF7上,包含相关属性的方式已经有了一些改变。试试这个:
var customer = db.tbl_Person
.Include(t => t.tbl_Customer).ThenInclude(c=>c.tbl_Address)
.Where(...).ToList();
您需要使用然后include
方法来包含第二个级别。看看这个
更新
我猜您正在检查tbl\u Customer
是否为null
,因为Person
和Customer
之间存在条件关系。另一种检查是否有客户
相关的方法是使用FK属性。例如,如果CustomerId
的类型为int
,并且Customer
始终与地址
相关(必需的关系),则可以执行以下操作:
var customer = db.tbl_Person
.Include(t => t.tbl_Customer.tbl_Address)
.Where(t => t.VendorID == person.VendorID &&
t.FirstName == person.FirstName &&
t.LastName == person.LastName &&
t.tbl_CustomerId != 0 && // compare with default value of your FK property
t.tbl_Customer.tbl_Address.State == address.State &&
t.tbl_Customer.tbl_Address.City == address.City).ToList();
分解where应该确保调用查询的第二部分。此外,您需要确保两个中间记录不为空
编辑:在位置之间添加了ToList()。为什么?因为注释中的错误反映了Linq正试图使用非参数化字段作为参数化字段来动态构建查询。通过将.ToList()置于两者之间,它强制查询在第一个子集上运行,然后筛选州和城市设置的对象。在尝试筛选出地址时仍会遇到相同的错误。
其他信息:无法将“System.Linq.Expressions.FieldExpression”类型的对象强制转换为“System.Linq.Expressions.ParameterExpression”。
@octavioccl这是我收到的错误,以作为答案well@chris,我不知道您的LINQtoEntities提供程序是否支持将null条件转换为正确的表达式。尝试删除第一个条件(t.tbl\u Customer?.tbl\u Address!=null
)。在我添加了额外的收费表以接收初始数据获取后,这一点非常有效@octavioccl这种零校验方式让我惊讶。谢谢你们的帮助!欢迎@chris,这是因为您使用的是linq to objects,而不是linq to entitiesinterest@octavioccl-快速搜索让我想到了这个关于差异的堆栈问题。嗨@chris我用另一个可能的解决方案更新了我的答案,现在我想到了。这样可以避免将不必要的客户加载到内存中,因为所有查询都是在服务器端执行的。
var customer = db.tbl_Person
.Include(t => t.tbl_Customer.tbl_Address)
.Where(t => t.VendorID == person.VendorID &&
t.FirstName == person.FirstName &&
t.LastName == person.LastName)
.ToList()
.Where(t => t.tbl_Customer?.tbl_Address != null &&
t.tbl_Customer.tbl_Address.State == address.State &&
t.tbl_Customer.tbl_Address.City == address.City).ToList();