嵌套在Select语句中的Navigation属性的FirstOrDefault 更多技术细节

我有一个带有子项导航属性的实体。每个孩子也都有孩子的财产。我需要访问第二级子级属性,根据条件获取FirstOrDefault条目并获取属性值。代码如下:

查询:

_repository.Where(product => product.Date >= startDate).Include(product => product.Shift).ThenInclude(shift => shift.Translations)
                  .GroupBy(product => product.Shift)
                  .OrderBy(pg => pg.Key.Id)
                  .Select(pg =>
                      new TupleDto<string,double>()
                      {
                          Item1 = pg.Key.Translations.FirstOrDefault(t => t.Language == "en").Title
                      }).ToListAsync();

实体:

public class Product
{        
    [Column(TypeName = "date")]
    public DateTime Date { get; set; }

    public int ShiftId { get; set; }

    [ForeignKey("ShiftId")]
    public Shift Shift { get; set; }
}

[Table("Shifts")]
public class Shift: FullAuditedEntity<int>,IMultiLingualEntity<ShiftTranslation>
{
    public ICollection<ShiftTranslation> Translations { get; set; }
}

[Table("ShiftTranslations")]
public class ShiftTranslation : Entity,IEntityTranslation<Shift>
{
    [Required]
    [Column(TypeName = "nvarchar(16)")]
    public string Title { get; set; }

    [Column(TypeName = "varchar(16)")]
    public string Language { get; set; }
    public Shift Core { get; set; }
    public int CoreId { get; set; }
}

我得到异常:

Processing of the LINQ expression 'AsQueryable<ShiftTranslation>(NavigationTreeExpression
    Value: default(IGrouping<Shift,ShoePair>)
    Expression: (Unhandled parameter: e).Key.Translations)' by 'NavigationExpandingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information.
System.InvalidOperationException: Processing of the LINQ expression 'AsQueryable<ShiftTranslation>(NavigationTreeExpression
    Value: default(IGrouping<Shift,ShoePair>)
    Expression: (Unhandled parameter: e).Key.Translations)' by 'NavigationExpandingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information.
   at microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   at microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   at microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   at microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   at System.Linq.Expressions.ExpressionVisitor.VisitMemberAssignment(MemberAssignment node)
   at System.Linq.Expressions.ExpressionVisitor.VisitMemberBinding(MemberBinding node)
   at System.Linq.Expressions.ExpressionVisitor.Visit[T](ReadOnlyCollection`1 nodes,Func`2 elementVisitor)
   at System.Linq.Expressions.ExpressionVisitor.VisitMemberInit(MemberInitExpression node)
   at System.Linq.Expressions.MemberInitExpression.accept(ExpressionVisitor visitor)
   at microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.ExpandNavigationsInExpression(NavigationExpansionExpression source,Expression expression)
   at microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.ExpandNavigationsinlambdaExpression(NavigationExpansionExpression source,LambdaExpression lambdaExpression)
   at microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.ProcessSelect(NavigationExpansionExpression source,LambdaExpression selector)
   at microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   at microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.ExpandAndReduce(Expression query,Boolean applyInclude)
   at microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.Expand(Expression query)
   at microsoft.EntityFrameworkCore.Query.QueryTranslationPreprocessor.Process(Expression query)
   at microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
   at microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query,Boolean async)
   at microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database,Expression query,IModel model,Boolean async)
   at microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass12_0`1.<ExecuteAsync>b__0()
   at microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryCore[TFunc](Object cacheKey,Func`1 compiler)
   at microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteAsync[TResult](Expression query,CancellationToken cancellationToken)
   at microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.ExecuteAsync[TResult](Expression expression,CancellationToken cancellationToken)
   at microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1.GetasyncEnumerator(CancellationToken cancellationToken)
   at System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.GetasyncEnumerator()
   at microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[tsource](IQueryable`1 source,CancellationToken cancellationToken)
   at DigitalFactory.Ftt.Report.ReportAppService.GetFttByShift(DateTime startDate,DateTime endDate,String factoryId,String productionLineId) in D:\work\DigitalFactory\DigitalFactory\aspnet-core\DigitalFactory\FTT\DigitalFactory.Ftt.Application\Report\ReportAppService.cs:line 104
   at lambda_method(Closure,Object )
   at microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult()
   at microsoft.AspNetCore.Mvc.Infrastructure.actionmethodExecutor.AwaitableObjectResultExecutor.Execute(IactionResultTypeMapper mapper,ObjectMethodExecutor executor,Object controller,Object[] arguments)
   at microsoft.AspNetCore.Mvc.Infrastructure.ControlleractionInvoker.<InvokeactionmethodAsync>g__Awaited|12_0(ControlleractionInvoker invoker,Valuetask`1 actionResultvalueTask)
   at microsoft.AspNetCore.Mvc.Infrastructure.ControlleractionInvoker.<InvokeNextactionFilterAsync>g__Awaited|10_0(ControlleractionInvoker invoker,Task lastTask,State next,Scope scope,Object state,Boolean isCompleted)
   at microsoft.AspNetCore.Mvc.Infrastructure.ControlleractionInvoker.Rethrow(actionExecutedContextSealed context)
   at microsoft.AspNetCore.Mvc.Infrastructure.ControlleractionInvoker.Next(State& next,Scope& scope,Object& state,Boolean& isCompleted)
   at microsoft.AspNetCore.Mvc.Infrastructure.ControlleractionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControlleractionInvoker invoker,Boolean isCompleted)
   at microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|25_0(ResourceInvoker invoker,Boolean isCompleted)

我猜这是由于EF Core 3.0中的更改中断所引起的。它是错误还是正确的行为? 是否可以重构查询以使其在SQL Server端工作而无需在客户端部分处理数据?

更多技术细节

EF核心版本: 数据库提供程序:microsoft.EntityFrameworkCore.SqlServer 目标框架:.NET Core 3.0 作业系统:Windows 10 IDE:Visual Studio 2019 16.3

starguping66896605 回答:嵌套在Select语句中的Navigation属性的FirstOrDefault 更多技术细节

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3119183.html

大家都在问