添加条件后将 IQueryable 转换为列表时出错

问题描述 投票:0回答:1

我正在使用 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”的调用来显式切换到客户端评估

添加条件之前,一切正常;我不知道问题是什么。

c# entity-framework-core iqueryable
1个回答
0
投票

如前所述,您应该在投影之前先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();

更改顺序的原因是当前您正在获取所有数据行,将投影转换为新的(行)格式,然后进行过滤。通过过滤行和下一步执行投影可以提高查询的性能。

© www.soinside.com 2019 - 2024. All rights reserved.