Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将where子句添加到EF中包含的实体中?_C#_Entity Framework - Fatal编程技术网

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

我有三张桌子

  • 人员表(通用人员表)
  • 客户表(每个客户都是一个人)
  • 地址表(每个客户都有一个地址)
我需要从实体框架中查询数据库,以获得关于此人姓名和城市、州的匹配。这就是我所拥有的,但除非我从where条款中删除state和city,否则它不会起作用

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();