我尝试使用以下查询,但结果出现错误消息
转换此查询需要 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 万行)。
有什么办法可以做到这一点吗?
您在这里不需要
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();
理想情况下,您应该考虑向您的实体引入对应关系,然后执行以下操作:
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