在导航属性中使用表达式

时间:2018-03-01 09:27:13

标签: c# sql-server tsql .net-core entity-framework-core

我可以在Entity Framework Core 2.0中执行以下操作:

Expression<Func<MyFirstEntity, bool>> myExpression = entity => entity.SomeProperty == true;
List<MyFirstEntity> myItems = context.MyFirstEntity.Where(myExpression).ToList();

MyFirstEntityMySecondEntity的外键。所以我可以在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。如果没有表达式,实体框架如何做到这一点?

另外我注意到我的两个工作示例中的结果查询是不同的,但到目前为止我没有注意到任何性能差异。有没有?

1 个答案:

答案 0 :(得分:0)

所以我找到了解决方案。 LINQKit救援。 AsExpndable()Compile()的工作示例:

List<MySecondEntity> myItems = context.MySecondEntity.AsExpandable()
    .Where(secondEntity  => secondEntity.MyFirstEntities
        .Any(myExpression.Compile())).ToList();