2014-09-02 173 views
1

我有一个查询,我试图得到一个驱动程序的工作队列,我需要查询返回,至少,驱动程序列表(有或没有,排队的工作)。一个驱动程序可以拥有很多或者没有的驱动程序队列记录。下面的代码返回0个项目。实体框架6左外连接

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

为什么你不能'db.Driver.Include(d => d.Queue)'?如果没有,解决这个问题。很少有人应该在实体框架中使用'Join'。 – Aron 2014-09-03 02:38:55

回答

1

如果您在Driver上收集了DriverQueue,则可以使用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();