首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在方法中执行efcore子查询(以提高可读性)

无法在方法中执行efcore子查询(以提高可读性)
EN

Stack Overflow用户
提问于 2022-04-12 20:46:53
回答 1查看 63关注 0票数 0

我试图使我的代码更简洁,更容易阅读,但我得到了一个efcore异常(他们指出这可能是一个限制),只是想看看是否有人能帮上忙。

我使用的是.net3.1和efcore也是3.1。

原代码工作:

代码语言:javascript
运行
复制
    public Response GetAll(long myId, DataSourceLoadOptions loadOptions)
    {
        var dbContext = ContextFactory.GetContext<IMyContext>();
        var query = dbContext.Table1.Where(_ => _.Id == myId).Select(ent1 => new
        {
            Id = ent1.Id,
            State = ent1.State,
            MatCode = ent1.Mat.Code,
            AmountToFulfill = ent1.AmountRequested,
            AmountReserved = dbContext.Table2.Where(matres => matres.Ent1Id == ent1.Id && matres.State == MaterialReservationState.Active).Select(_ => _.AmountReserved).Sum(),
            LastChangeTime = ent1.ChangeTime,
        });

        return query.ToList();
    }

非工作代码:

代码语言:javascript
运行
复制
    public Response GetAll2(long myId, DataSourceLoadOptions loadOptions)
    {
        var dbContext = ContextFactory.GetContext<IMyContext>();
        var query = dbContext.Table1.Where(_ => _.Id == myId).Select(ent1 => new
        {
            Id = ent1.Id,
            State = ent1.State,
            MatCode = ent1.Mat.Code,
            AmountToFulfill = ent1.AmountRequested,
            AmountReserved = GetReservedAmount(dbContext, ent1).Sum(),
            LastChangeTime = ent1.ChangeTime,
        });

        return query.ToList();
    }

    private static IQueryable<int> GetReservedAmount(IMyContext dbContext, IEntity1 ent1)
    {
        return dbContext.Table2
            .Where(matres => matres.Ent1Id == ent1.Id && matres.State == MaterialReservationState.Active)
            .Select(_ => _.AmountReserved);
    }

例外:

21:26:28.1605在执行请求时发生了未处理的异常。{ SourceContext="Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware",{Id=1,Name="UnhandledException"},EventId=RequestId=“0HxxxA83M7JB:00000001”,RequestPath="/xxxxxxxxxx/2",SpanId="|5exxx39-48248xxxxx5b806.1.eee74277_",TraceId="5e3cde39-4824xxxxx",ParentId=“5e3xxxde39-48248xxxxxxxxxa25b806.1”,ConnectionId=“0xxxxx”,ThreadId=11} System.InvalidOperationException:处理Q表达式'ClassName.GetAll2( dbContext:__dbContext_1,op:(NavigationTreeExpression Value:(dbContext:dbContext)表达式:#))#en21 20()被‘’失败。这可能表示EF中存在缺陷或限制。有关更多详细信息,请参见https://go.microsoft.com/fwlink/?linkid=2101433。在Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) .

EN

回答 1

Stack Overflow用户

发布于 2022-04-12 21:41:04

你所犯的错误给了你完整的解释--哪里出了问题:

处理LINQ表达式'ClassName.GetAll2( dbContext:__dbContext_1,op:(NavigationTreeExpression值:(EntityReference: Entity1)表达式:o.Outer) .Sum()‘NavigationExpandingExpressionVisitor’失败。

如果您转到提供的链接(https://go.microsoft.com/fwlink/?linkid=2101433),那么您可以读到:

EF支持顶层投影中的部分客户端评估(本质上是对Select()的最后调用)。如果查询中的顶级投影不能转换到服务器,EF将从服务器获取任何所需的数据,并在客户机上评估查询的其余部分。如果EF Core在顶层投影之外的任何地方检测到一个表达式,而该表达式不能被转换到服务器,那么它将抛出一个运行时异常。

你的方法

代码语言:javascript
运行
复制
private static IQueryable<int> GetReservedAmount(IMyContext dbContext, IEntity1 ent1)
{
    return dbContext.Table2
        .Where(matres => matres.Ent1Id == ent1.Id && matres.State == MaterialReservationState.Active)
        .Select(_ => _.AmountReserved);
}

无法转换为TSQL查询语法。

仅此而已,EF 3.0客户端方法不能转换为TSQL。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71848931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档