0

データベースのテーブル構造を変更できない場所で更新する必要があるアプリを継承しました。

ID | PromoID | VersionDate | Type
1    P0001     01/03/2013    Live
2    P0002     02/03/2013    Live
3    P0001     02/04/2012    Draft
4    P0003     01/03/2013    Live
5    P0003     01/02/2013    Live

したがって、元の開発者には、レコードのバージョン管理という原始的な概念がありました。私がする必要があるのは、すべての「ライブ」バージョンの最新バージョンを返す linq クエリを作成することですが、そのバージョンのいずれかのタイプが「ドラフト」の場合、レコードが返されないようにする必要もあります。

私はこれを持っています:

var records = from r in _context.Promotions
              let maxversion =
                             (from v in _context.Promotions
                              where v.PromoID == t.PromoID
                              select v.VersionDate).Max()
              where r.Type == "Live"
              && r.VersionDate == maxversion
              select r

しかし、同じ PromoID を持つすべてのレコードを除外する方法がわかりません。そのうちの 1 つは「下書き」タイプです。私が提供したデータから、レコード #1 と #3 の両方を削除する必要があります。これらは同じ PromoId を共有し、#3 にはドラフトのタイプがあるためです。

4

2 に答える 2

2

これも実行する必要があります。結果の IEnumerable (評価された場合) は、データベースに対して 1 つのクエリのみを生成する必要があります。

var ids_with_drafts = from p1 in _context.Promotions
                      where p1.Type == "Draft"
                      select p1.PromotionID;

var result = from promotion in _context.Promotions
             where !ids_with_drafts.Contains(promotion.PromotionID)
             group promotion by promotion.PromotionID
             into grp
             select grp.OrderByDescending(x => x.VersionDate).First();
于 2013-07-03T14:26:52.760 に答える
0

このようなものが動作するはずです:

var records = from r in _context.Promotions
              let maxversion =
                             (from v in _context.Promotions
                              where v.PromoID == t.PromoID
                              select v.VersionDate).Max()
              where r.Type == "Live"
              && r.VersionDate == maxversion
              && !_context.Promotions.Any(p => p.PromoID = t.PromoID && p.Type=="Draft")
              select r
于 2013-07-03T13:13:11.947 に答える