1

データベースから3つの列、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、Status =承認済みで検索してから、最大expirationDateを使用しようとしています。

4

3 に答える 3

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();
于 2012-07-06T18:24:05.197 に答える
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();
于 2012-07-06T19:41:56.707 に答える
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

  }); 
于 2012-07-06T18:27:33.423 に答える