linq查询,如果存在上一个日期,则按最大日期搜索

时间:2012-07-06 18:06:37

标签: linq c#-4.0

我正在尝试从数据库中获取三列,DecalExpireDate,DecalExpireMonth和DecalExpireYear。基本上,我正在尝试检查它是否有一个以前的到期日期,如果有,我需要获得最新的到期日期,因为它可能有多个先前的到期日期。

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搜索,状态=已批准,然后我尝试使用max expirationDate。

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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

  }); 

答案 2 :(得分: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();