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