实体框架6离开了外连接

时间:2014-09-02 23:14:50

标签: entity-framework entity-framework-6.1

我有一个查询,我正在尝试获取驱动程序工作的队列,我需要查询至少返回驱动程序列表(有或没有排队工作)。一个驱动程序可以有许多或没有驱动程序队列记录。以下代码返回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表目前没有记录,因此我应该只获取没有记录的驱动程序列表。

1 个答案:

答案 0 :(得分:1)

如果您在DriverQueue上收集了Driver,则可以使用SelectManyDefaultIfEmpty

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();

如果没有,您可以使用GroupJoinDefaultIfEmptySelectMany来实现这一目标。

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();