如何在EF中的包含实体中添加where子句?

时间:2015-12-04 17:06:02

标签: c# entity-framework

我有三张桌子

  • 人员表(通用人员表)
  • 客户表(每个客户都是个人)
  • 地址表(每个客户都有一个地址)

我需要从实体框架查询数据库,以查找人名和城市,州的匹配情况。这就是我所拥有的,但除非我从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'。

2 个答案:

答案 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,因为PersonCustomer之间存在条件关系。检查您是否有Customer相关的另一种方法是使用FK属性。例如,如果CustomerId的类型为intCustomer始终与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();