在导航属性中使用表达式



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

相关内容

  • 没有找到相关文章

最新更新