在导航属性中使用表达式[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

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

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

c# sql-server tsql .net-core entity-framework-core
1个回答
0
投票

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

List<MySecondEntity> myItems = context.MySecondEntity.AsExpandable()
    .Where(secondEntity  => secondEntity.MyFirstEntities
        .Any(myExpression.Compile())).ToList(); 
© www.soinside.com 2019 - 2024. All rights reserved.