我可以在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。如果没有表达式,实体框架如何做到这一点?
另外我注意到我的两个工作示例中的结果查询是不同的,但到目前为止我没有注意到任何性能差异。有没有?
答案 0 :(得分:0)
所以我找到了解决方案。 LINQKit救援。 AsExpndable()
和Compile()
的工作示例:
List<MySecondEntity> myItems = context.MySecondEntity.AsExpandable()
.Where(secondEntity => secondEntity.MyFirstEntities
.Any(myExpression.Compile())).ToList();