【发布时间】:2018-08-09 07:58:52
【问题描述】:
我可以在 Entity Framework Core 2.0 中执行以下操作:
Expression<Func<MyFirstEntity, bool>> myExpression = entity => entity.SomeProperty == true;
List<MyFirstEntity> myItems = context.MyFirstEntity.Where(myExpression).ToList();
MyFirstEntity 有一个指向 MySecondEntity 的外键。所以我可以在MySecondEntity 中使用导航属性。
例子:
List<MySecondEntity> myItems = context.MySecondEntity
.Where(secondEntity => secondEntity.MyFirstEntities
.Any(firstEntity => firstEntity.SomeProperty == true)).ToList();
我想在查询中使用myExpression。像这样的东西会很好:
List<MySecondEntity> myItems = context.MySecondEntity
.Where(secondEntity => secondEntity.MyFirstEntities
.Any(myExpression)).ToList();
但这会产生编译时错误,因为secondEntity.MyFirstEntities 没有实现IQueryable。定义Func<MyFirstEntity, bool> 用于导航属性也不起作用(运行时错误,因为实体框架不知道定义的Func)。
我目前的解决方案是这样的:
List<MySecondEntity> myItems = context.MySecondEntity
.Where(secondEntity => context.MyFirstEntities
.Where(firstEntity => firstEntity.SecondEntityId == secondEntity.Id)
.Any(myExpression)).ToList();
这确实在某种程度上破坏了导航属性的用途。
有没有更好的解决方案?
为什么导航属性不是“IQueryable”?它们必须以某种方式转换为 SQL。没有表达式,实体框架如何做到这一点?
我还注意到我的两个工作示例中的查询结果不同,但到目前为止我没有注意到任何性能差异。有吗?
【问题讨论】:
标签: c# sql-server tsql .net-core entity-framework-core