Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';客户端评估efcore后的t进程集操作_C#_.net Core_Entity Framework Core - Fatal编程技术网

C# Can';客户端评估efcore后的t进程集操作

C# Can';客户端评估efcore后的t进程集操作,c#,.net-core,entity-framework-core,C#,.net Core,Entity Framework Core,Ef核心接收错误 System.InvalidOperationException:之后无法处理集合操作 客户评估,考虑在最后一个阶段进行操作 Select()调用(参见第16243期)位于 Microsoft.EntityFrameworkCore.Query.SqlExpressions.SelectExpression.ApplyStoOperation(SetOperationType setOperationType、SelectExpression和select2,布尔值不同) 执行

Ef核心接收错误

System.InvalidOperationException:之后无法处理集合操作 客户评估,考虑在最后一个阶段进行操作 Select()调用(参见第16243期)位于 Microsoft.EntityFrameworkCore.Query.SqlExpressions.SelectExpression.ApplyStoOperation(SetOperationType setOperationType、SelectExpression和select2,布尔值不同)

执行时

 public async Task<object> GetUnitsForDataTableAsync() =>
        
            await context.Units
             .Where(x => !x.TractUnitJunctions.Any())
              .Select(x => new
              {
                  x.Id,
                  x.UnitName,
                  x.UnitAcres,
                  TractNum = String.Empty,
                  Wells = String.Empty,
                  NumOfWells = 0,
              })
              .Union(
                        context.TractUnitJunctions
                        .Select(x => new
                         {
                            Id = x.UnitId,
                            x.Unit.UnitName,
                            x.Unit.UnitAcres,
                            x.Tract.TractNum,
                            Wells = string.Join(", ", x.TractUnitJunctionWellJunctions
                                              .Select(z => $"{z.Well.WellNum} ({z.Well.ApiNum})")
                                        ),
                            NumOfWells = x.TractUnitJunctionWellJunctions.Count()
                 }))
                .ToListAsync().ConfigureAwait(false);
公共异步任务GetUnitsForDataTableAsync()=>
等待上下文。单位
.Where(x=>!x.TractUnitJunctions.Any())
.选择(x=>new
{
x、 身份证,
x、 单位名称,
x、 UnitAcres,
TractNum=String.Empty,
Wells=String.Empty,
NumOfWells=0,
})
.工会(
context.TractUnitJunctions
.选择(x=>new
{
Id=x.UnitId,
x、 Unit.UnitName,
x、 Unit.UnitAcres,
x、 Tract.TractNum,
Wells=string.Join(“,”,x.TractUnitJunctionWellJunctions
.Select(z=>$“{z.Well.WellNum}({z.Well.ApiNum})”)
),
NumOfWells=x.TractUnitJunctionWellJunctions.Count()
}))
.ToListSync().ConfigureAwait(false);
但是,如果我将函数分解为两个查询,它就可以正常工作

 public async Task<object> GetUnitsForDataTableAsync()
        {
            var List1 = await context.Units
             .Where(x => !x.TractUnitJunctions.Any())
              .Select(x => new
              {
                  x.Id,
                  x.UnitName,
                  x.UnitAcres,
                  TractNum = String.Empty,
                  Wells = String.Empty,
                  NumOfWells = 0,
              })
             .ToListAsync().ConfigureAwait(false);

            var List2 = await context.TractUnitJunctions
                 .Select(x => new
                 {
                     Id = x.UnitId,
                     x.Unit.UnitName,
                     x.Unit.UnitAcres,
                     x.Tract.TractNum,
                     Wells = string.Join(", ", x.TractUnitJunctionWellJunctions
                                              .Select(z => $"{z.Well.WellNum} ({z.Well.ApiNum})")
                                        ),
                     NumOfWells = x.TractUnitJunctionWellJunctions.Count()
                 })
                .ToListAsync().ConfigureAwait(false);


            return List1.Concat(List2);
        }
公共异步任务GetUnitsForDataTableAsync() { var List1=await context.Units .Where(x=>!x.TractUnitJunctions.Any()) .选择(x=>new { x、 身份证, x、 单位名称, x、 UnitAcres, TractNum=String.Empty, Wells=String.Empty, NumOfWells=0, }) .ToListSync().ConfigureAwait(false); var List2=await context.TractUnitJunctions .选择(x=>new { Id=x.UnitId, x、 Unit.UnitName, x、 Unit.UnitAcres, x、 Tract.TractNum, Wells=string.Join(“,”,x.TractUnitJunctionWellJunctions .Select(z=>$“{z.Well.WellNum}({z.Well.ApiNum})”) ), NumOfWells=x.TractUnitJunctionWellJunctions.Count() }) .ToListSync().ConfigureAwait(false); 返回列表1.Concat(列表2); }
我已经对这个错误进行了一些研究,但我不确定如何重构第一个查询来绕过这个错误

这是EF Core的一个限制,我认为它永远也解决不了。 第一个列表很容易翻译成SQL,但第二个列表是通过客户端评估部分加载查询,不能与Concat函数一起使用。因此,您必须运行两个查询,并在客户端创建union


无论如何,这个查询可以很容易地由SQL编写(取决于方言),而无需Concat和急于加载。或者通过具有适当扩展名的LINQ(将根据请求提供解决方案)

您可能应该移动
字符串。在
.ToList()之后加入
逻辑。这是EF核心