EF Core 和 sqlite 联接导致“需要 SQL APPLY 操作,sqlite 不支持”

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

我尝试使用以下查询,但结果出现错误消息

转换此查询需要 SQL APPLY 操作,而 SQLite 不支持该操作。

return await (from c in _dbContext.Charter
              join r in _dbContext.Roster on c.Id equals r.CharterId into rosters
              select new CharterGridData
                     {
                         CharterName = c.Name,
                         Roster = rosters.ToList()
                     }).ToListAsync();

我尝试过做类似的事情

Roster = _dbContext.Roster.Where(r => r.CharterId == c.Id)

但它根本不加载(

Roster
表有超过 200 万行)。

有什么办法可以做到这一点吗?

c# sqlite entity-framework-core
2个回答
0
投票

您在这里不需要

GroupJoin
。 EF Core 对该运算符的支持很差。

var query =
    from c in _dbContext.Charter
    select new CharterGridData
    {
        CharterName = c.Name,
        Roster = _dbContext.Roster.Where(r => c.Id == r.CharterId).ToList()
    };
    
var result = await query.ToListAsync();

0
投票

理想情况下,您应该考虑向您的实体引入对应关系,然后执行以下操作:

public class Charter
{
    public int Id { get; set; }
    // ...
    public List<Roster> Rosters { get; set; }
}


public class Roster
{
    public int Id { get; set; }
    // ...
    public Charter Charter { get; set; }
    public int CharterId { get; set; }
}

var charters = ctx.Charter
    .Select(c => new CharterGridData
    {
        CharterName = c.Name,
        Roster = c.Rosters.ToList()
    })
    .ToList();

请注意,这将实现

left outer join
(如果需要,可以通过
.Where(p => p.Rosters.Any())
客户端/服务器端解决)。

不固定实体的方法(也

left outer join
):

var list = (from c in ctx.Charter
        select new CharterGridData
        {
            CharterName = c.Name,
            Roster = ctx.Roster.Where(r => c.Id == r.CharterId).ToList()
        })
    .ToList();

inner join
将需要选择中间对象并在客户端处理数据:

var list = (from c in ctx.Charter
        join r in ctx.Roster on c.Id equals r.CharterId
        select new
        {
            CharterId = c.Id,
            CharterName = c.Name,
            Roster = r
        })
    .ToList();

// todo group and select new objects
© www.soinside.com 2019 - 2024. All rights reserved.