2014-09-02 224 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();