2012-07-06 54 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