i可以在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();
这确实破坏了导航属性的目的。
有更好的解决方案吗?
为什么导航属性不可用?它们必须以某种方式转变为SQL。实体框架如何在没有表达式的情况下执行此操作?
我还注意到我的两个工作示例中所产生的查询是不同的,但是到目前为止,我尚未注意到任何性能差异。有没有?
,所以我找到了解决方案。Linqkit进行营救。使用AsExpndable()
和Compile()
的工作示例:
List<MySecondEntity> myItems = context.MySecondEntity.AsExpandable()
.Where(secondEntity => secondEntity.MyFirstEntities
.Any(myExpression.Compile())).ToList();