我正在使用 EF Core 7.0。在我的代码中,我创建了一个像这样的
IQueryable
:
DbSet<Ticket>()
.Select(t => new AllTicketsDto
{
Id = t.Id,
OrderId = t.OrderId,
// ...
})
通过这样的条件后
if (TicketStatus == EnumTicketStatus.Done)
query = query.Where(x => x.IsClosedByCallCenter == true);
query
变成这样:
DbSet<Ticket>()
.Select(t => new AllTicketsDto
{
Id = t.Id,
OrderId = t.OrderId,
// ...
})
.Where(x => x.IsClosedByCallCenter == (bool?)True)
当我想将其转换为列表时:
var myList = query.ToList();
我收到错误:
无法翻译。以可翻译的形式重写查询,或者通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用来显式切换到客户端评估
添加条件之前,一切正常;我不知道问题是什么。
如前所述,您应该在投影之前先append过滤条件。
var query = DbSet<Ticket>().AsQueryable();
// Filter criteria
if (TicketStatus == EnumTicketStatus.Done)
query = query.Where(x => x.IsClosedByCallCenter == true);
// Projection and materialize query
var result = query.Select(t => new AllTicketsDto
{
Id = t.Id,
OrderId = t.OrderId,
// ...
})
.ToList();
更改顺序的原因是当前您正在获取所有数据行,将投影转换为新的(行)格式,然后进行过滤。通过过滤行和下一步执行投影可以提高查询的性能。