过滤让我们

时间:2013-08-19 13:08:57

标签: c# linq linq-to-entities

我使用以下tblTradeSpends表继承了一个应用程序:

ID   PromoID    Customer    LineOfBusiness     DealYear    VersionDate
1    p100       200         SCF                2013        2/23/2013
2    p101       200         SCF                2013        2/23/2013
3    p102       200         SCF                2013        2/23/2013
4    p103       200         SCF                2013        2/23/2013
5    p100       200         SCF                2013        3/23/2013
6    p101       200         SCF                2013        3/23/2013
7    p102       200         SCF                2013        3/23/2013

Customer,LineOfBusiness,DealYear和VersionDate的组合构成了一系列交易的“版本”概念。上述数据描述了两个版本,其中包含以下促销ID:

Version 1 (Created 2/23/2013): p100, p101, p102, p103

Version 2 (Created 3/23/2013): p100, p101, p102

因此,当此交易块更新时,PromoID p103的交易已被删除。

我有一个屏幕,我想只显示一个交易块的最新版本。我想出了以下内容,我认为它正在工作,但实际上有一个错误:

var records = from t in query
let maxversion =
            (from v in _context.tblTradeSpends
            where v.PromoID == t.PromoID
            select v.VersionDate).Max()
where t.PlanType == "Planner" &&
t.VersionDate == maxversion
select t

现在,销售员在最新版本中删除了p103交易,但因为它拥有促销ID的任何交易的最大日期,所以它正在显示。

ID   PromoID    Customer    LineOfBusiness     DealYear    VersionDate
4    p103       200         SCF                2013        2/23/2013
5    p100       200         SCF                2013        3/23/2013
6    p101       200         SCF                2013        3/23/2013
7    p102       200         SCF                2013        3/23/2013

我不希望此结果集中有p103。如何更新我的查询以便我只显示具有最新VersionDate的记录,以获得Customer,LineOfBusiness和DealYear的唯一组合?

更新

如果它没有太多混乱,在SQL中我会按Customer#,LineOfBusiness和DealYear分组,确定该组的最大VersionDate,然后将该日期用于我的过滤器。我不确定如何在这里做同样的事情。

4 个答案:

答案 0 :(得分:2)

这样的东西?

    var records = from t in query
    let maxversion =
            (from v in _context.tblTradeSpends
            where v.Customer == t.Customer
            && v.LineOfBusiness == t.LineOfBusiness
            && v.DealYear == t.DealYear
            select v.VersionDate).Max()
    where t.PlanType == "Planner" &&
    t.VersionDate == maxversion
    select t

答案 1 :(得分:1)

好的,如果我理解正确,p103会被删除,因为它的VersionDate不是表中的最大值。所以这意味着当表格有新VersionDate时,例如4/23/2013时,所有没有此日期的记录都应该被忽略?

ID   PromoID    Customer    LineOfBusiness     DealYear    VersionDate
1    p103       200         SCF                2013        2/23/2013  // Deprecated
2    p102       200         SCF                2013        2/23/2013  // Deprecated
3    p102       200         SCF                2013        3/23/2013

听起来你只需要表格的最大VersionDate,以及拥有它的所有记录。正确的吗?

var records = from t in query
    let maxversion =
        (from v in _context.tblTradeSpends
        where v.Customer == t.Customer &&
              v.LineOfBusiness == t.LineOfBusiness &&
              v.DealYear == t.DealYear
        select v.VersionDate).Max()
    where t.PlanType == "Planner" &&
    t.VersionDate == maxversion 
    select t

答案 2 :(得分:1)

这适用于Linq对象,不确定是否使用Linq2SQL / EF

var records = (from t in _context.tblTradeSpends
       where t.PlanType == "Planner"
       group t by new { t.Customer, t.LineOfBusiness, t.DealYear } into g
       let maxVersion = g.Max(promo => promo.VersionDate)
       select g.Where(p => p.VersionDate == maxVersion)).SelectMany(s => s)

答案 3 :(得分:0)

我认为问题在于,因为您在子查询中使用t,每行都有一个maxversion,而不是整个行。您需要从所需的结果中选择最大版本。这可能有效:

var query = query.Where(t => t.PlanType == "Planner");
var records = from t in query
  let maxversion =
            (from v in query
            select v.VersionDate).Max()
  where t.VersionDate == maxversion
  select t;