我有一个查询,我正在尝试获取驱动程序工作的队列,我需要查询至少返回驱动程序列表(有或没有排队工作)。一个驱动程序可以有许多或没有驱动程序队列记录。以下代码返回0项。
var queues = db.DriverQueues.AsNoTracking().Join(db.Drivers
, z => z.DriverID //FK
, y => y.DriverID //PK
, (y, z) => new
{
Driver = z,
DriverQueue = y
})
.OrderBy(y => y.Driver.DriverID)
.ThenBy(z => z.DriverQueue.IntermodalWorkID).ToList();
此外,DriverQueue表目前没有记录,因此我应该只获取没有记录的驱动程序列表。
答案 0 :(得分:1)
如果您在DriverQueue
上收集了Driver
,则可以使用SelectMany
和DefaultIfEmpty
。
public ICollection<DriverQueue> DriverQueues { get; set; }
代码:
var queues = db.Drivers.AsNoTracking()
.SelectMany(d => d.DriverQueues
.DefaultIfEmpty()
.Select(q => new { Driver = d, DriverQueue = q }))
.OrderBy(d => d.Driver.DriverID)
.ThenBy(q => q.DriverQueue.IntermodalWorkID)
.ToList();
如果没有,您可以使用GroupJoin
,DefaultIfEmpty
和SelectMany
来实现这一目标。
var queues = db.Drivers.AsNoTracking()
.GroupJoin(
db.DriverQueues,
d => d.DriverID, // PK
q => q.DriverID, // FK
(d, qs) => qs
.DefaultIfEmpty()
.Select(q => new { Driver = d, DriverQueue = q }))
.SelectMany(g => g)
.OrderBy(d => d.Driver.DriverID)
.ThenBy(q => q.DriverQueue.IntermodalWorkID)
.ToList();