我有三张桌子
我需要从实体框架查询数据库,以查找人名和城市,州的匹配情况。这就是我所拥有的,但除非我从where子句
中删除州和城市,否则它不起作用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'。
答案 0 :(得分:3)
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();
分解where应该确保调用查询的次要部分。此外,您需要确保两个介入记录不为空。
编辑:添加了Tolist()。为什么?因为注释中的错误反映出Linq正在尝试使用非参数化字段作为参数化字段来动态构建查询。通过在它们之间放置.ToList(),它会强制查询在第一个子集上运行,然后过滤State和City设置的那个。
答案 1 :(得分:2)
我认为包含相关属性的方式在EF 7上有所改变。试试这个:
var customer = db.tbl_Person
.Include(t => t.tbl_Customer).ThenInclude(c=>c.tbl_Address)
.Where(...).ToList();
您需要使用ThenInclude
方法来包含您的第二级。请检查此reference。
我想您正在检查tbl_Customer
是否不是null
,因为Person
和Customer
之间存在条件关系。检查您是否有Customer
相关的另一种方法是使用FK属性。例如,如果CustomerId
的类型为int
且Customer
始终与Address
(必需的关系)相关,则可以执行以下操作:
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();