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 和 #3,因为它们共享相同的 PromoId 并且 #3 具有草稿类型。

4

2 回答 2

2

这也应该这样做,结果 IEnumerable(评估时)仍然应该只生成对数据库的单个查询;

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 回答