2011-04-06 106 views
3

我之前發佈了一個問題,但現在我已經縮小了問題範圍,這是非常不同的。基本上,我有一個相當長的查詢,旨在從數據庫選擇值到一個自定義結構(我將在下面顯示),但我遇到了連接問題 - paticulary試圖只選擇連接的第一行。這裏是我的查詢:LINQ to SQL使用FirstOrDefault()加入問題

IENumerable<VehicleDetails> list = (
    from s in dc.Vehicles 
    join veh in dc.VehicleTypes 
     on s.VehicleType equals veh.ID into vg 
    from v in vg.DefaultIfEmpty() 
    join consignments in dc.Consignments 
     .FirstOrDefault(x => x.TripDate > dateFrom && 
      x.TripDate < dateTo && 
      x.DeliveryDepot == depot.Letter && 
      (x.DeliveryStatus == 2 || x.DeliveryStatus == 3)) 
     on new 
     { 
      Reg = s.VehicleReg, 
      Depot = s.VehicleDepot 
     } equals new 
     { 
      Reg = consignments.VehicleReg, 
      Depot = consignments.DeliveryDepot 
     } into con 
    from c in con.DefaultIfEmpty() 
    select new 
    { 
     VehicleType = (
      s.VehicleType == null ? "?": 
      v.VehicleType1.ToString()), 
     TotalRate = c.Rate + c.AddCharges, 
     VehicleReg = (string.IsNullOrEmpty(c.VehicleReg) ? 
      c.Subcontractor: c.VehicleReg), 
     VehicleTypeName = (v.VehicleTypeDescription == null ? 
      "SubContractor": v.VehicleTypeDescription) 
    }); 

我的結構:

public struct VehicleDetails 
{ 
    internal string VehicleType; 
    internal decimal TotalRate; 
    internal string VehicleReg; 
    internal string VehicleTypeName; 
} 

隨着在FirstOrDefault()第二加入,我得到:

在 類型的表達式之一的加盟子句是不正確的。在呼叫組 加入時,輸入 推斷失敗。

沒有它(並與更換FirstOrDefault一凡代替),我得到含蓄錯誤轉換的anonymoustype成「vehicledetials」類型。這兩個錯誤都發生在from c in con.DefaultIfEmpty()調用中。

任何想法將是非常,非常感激

+1

請將您的代碼縮減爲代碼問題。在目前的狀態下,沒有人會弄清楚並回答你的問題。 – Steven 2011-04-06 15:35:43

回答

9

FirstOrDefault()將熱切返回一個元素,但你需要的是元素的集合(IQueryable的)。

所以

dc.Consignments 
    .Where(x => x.TripDate > dateFrom && 
       x.TripDate < dateTo && 
       x.DeliveryDepot == depot.Letter && 
       (x.DeliveryStatus == 2 || x.DeliveryStatus == 3)) 
    .Take(1) 

會返回一個延遲集合將只有一個元素。

+1

這是如何處理默認的? – ametren 2013-04-19 20:39:56

0

爲什麼不讓你的查詢更簡單!

  1. 我強烈建議在查詢結束時使用FirstOrDefault()(查詢的最後一個方法)。
  2. 把你的條件對Where更好,而不是FirstOrDefault因爲你打算把它在最後

我覺得這裏的錯誤是FirstOrDefaultjoin,使用時加入,你應該用一個連接你就像收集不是單個項目(單個是FirstOrDefault的結果)