【问题标题】:Using expressions in navigation property [duplicate]在导航属性中使用表达式 [重复]
【发布时间】:2018-08-09 07:58:52
【问题描述】:

我可以在 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&lt;MyFirstEntity, bool&gt; 用于导航属性也不起作用(运行时错误,因为实体框架不知道定义的Func)。

我目前的解决方案是这样的:

List<MySecondEntity> myItems = context.MySecondEntity
    .Where(secondEntity  => context.MyFirstEntities
         .Where(firstEntity => firstEntity.SecondEntityId == secondEntity.Id)
         .Any(myExpression)).ToList();

这确实在某种程度上破坏了导航属性的用途。

有没有更好的解决方案?

为什么导航属性不是“IQueryable”?它们必须以某种方式转换为 SQL。没有表达式,实体框架如何做到这一点?

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 2016-04-18
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 2020-03-12
      • 1970-01-01
      相关资源
      最近更新 更多