2012-07-06 40 views
1

我試圖從數據庫中取回三列,DecalExpireDate,DecalExpireMonth和DecalExpireYear。基本上,我試圖檢查它是否有以前的到期日期,如果它有,我需要得到最新的到期日期,因爲它可能有多個以前的到期日期。linq查詢,如果存在上一個日期,則按最大日期搜索

var previousExpirationDate = (from d in db.CT_Decals 
     where d.TankID == decal.TankID 
     && d.DecalStatus == "Approved" 
     && d.DecalExpireDate == ((from dn in db.CT_Decals 
           where dn.TankID == decal.TankID 
           && dn.DecalStatus == "Approved" 
           select dn.DecalExpireDate).Max()) 
     select new 
     { 
     d.DecalExpireDate, 
     d.DecalExpireMonth, 
     d.DecalExpireYear 

     }); 

此查詢不起作用,有人可以看到問題嗎?我正在通過TankID進行搜索,Status = approved,然後嘗試使用max expirationDate。

+0

它會引發一些錯誤? – Jorge 2012-07-06 18:19:50

+0

不會帶回任何東西,如果我檢查即時窗口,它將顯示查詢的文本 – user1202606 2012-07-06 18:25:22

回答

1

這個怎麼樣

var result = db.CT_Decals.Where(o => o.TankId == decal.TankId && o.DecalStatus == "Approved") 
        .OrderByDescending(o => o.DecalExpireDate) 
        .Select(o => new { o.DecalExpireDate, 
            o.DecalExireMonth, 
            o.DecalExireYear }).First() 

var result = (from d in db.CT_Decals 
         where d.TankID == 1 && d.Status == "Approved" 
         orderby d.ExpireDate descending 
         select new { d.DecalExpireDate, 
            d.DecalExpireMonth, 
            d.ExpireDate }).First(); 
0

它與那個max函數不能在你需要的,所以你可以嘗試這樣

範圍被翻譯成 Sql的問題
var previousExpirationDate = (from d in db.CT_Decals 
    where d.TankID == decal.TankID 
    && d.DecalStatus == "Approved" 
    && d.DecalExpireDate == ((from dn in db.CT_Decals 
          where dn.TankID == decal.TankID 
          && dn.DecalStatus == "Approved" 
          order by dn.DecalExpireDate 
          select dn.DecalExpireDate).First()) 
    select new 
    { 
    d.DecalExpireDate, 
    d.DecalExpireMonth, 
    d.DecalExpireYear 

    }); 
0

雖然Max可能是您的問題例如,找到正確使用它的方法會很好,因爲它比排序更快。如何:

編輯:這個答案只返回DecalExpireDate

var previousExpirationDate = (from d in db.CT_Decals 
     where d.TankID == decal.TankID 
     && d.DecalStatus == "Approved" 
     select new 
     { 
     d.DecalExpireDate, 
     d.DecalExpireMonth, 
     d.DecalExpireYear 
     }).Max(d => d.DecalExpireDate); 

對於這個版本,你將不得不測試,看看它是否值得做的一個額外的呼叫數據庫,以避免排序:

var latestDate = (from d in db.CT_Decals 
     where d.TankID == decal.TankID 
     && d.DecalStatus == "Approved" 
     select d.DecalExpireDate).Max(); 

var previousExpirationDate = (from d in db.CT_Decals 
     where d.TankID == decal.TankID 
     && d.DecalStatus == "Approved" 
     && d.DecalExpireDate == latestDate 
     select new 
     { 
     d.DecalExpireDate, 
     d.DecalExpireMonth, 
     d.DecalExpireYear 
     }).First(); 
+0

現在如何訪問這些值?所以,如果我想獲得DecalExpireDate或DecalExpireMonth等..... – user1202606 2012-07-06 21:17:57