2013-08-19 33 views
4

我继承了一个应用程序有以下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 

客户的组合,LineOfBusiness,DealYear和VersionDate一补“版本”的理念,为交易的块。以上数据说明两个版本具有以下促销标识:

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

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

所以,当交易这个块更新,PromoID p103交易已被删除。

我有一个屏幕,我只想显示一个交易块的最新版本。我想出了下面,我以为是工作,但实际上有一个bug:

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。如何更新我的查询,以便仅显示具有Customer,LineOfBusiness和DealYear的独特组合的最新VersionDate的记录?

UPDATE

如果没有浑水摸鱼的太多,在SQL我会通过客户#组,LineOfBusiness和DealYear,确定最大VersionDate的组,然后使用日期我的过滤器。我不确定如何在这里做同样的事情。

+0

这是否P103行都有一个值是不常见到的其他结果?你只想删除结果集中的第p103行? –

+0

我想删除没有版本日期等于具有相同Customer#,LineOfBusiness和DealYear的任何其他记录的最大版本日期的任何记录。那有意义吗? –

+0

是的,但你现在的问题是,p103有一个版本日期是最大化版本,因此它被包含在列表中。MaxVersion在这里是3/23/2013? –

回答

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

好的,如果我理解正确,p103会被删除,因为它的VersionDate不是表中的最大值。那么这意味着当表格有新的VersionDate s时,例如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 
+0

不,我不需要表的最大VersionDate,因为我们有优惠的块十万,我需要的最大VersionDate为客户#,LineOfBusiness和DealYear每个独特组合。我提供的样本数据是用于澄清我的问题的一个无限小的子集。 –

+0

@ChrisHardie好吧,现在呢? – Artless

+0

邦上,但另一个人只是打你与相同的查询。干杯! –

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; 
+0

这不只是让我的表最大版本日期?该日期不适用于大部分交易。我越想到它,我越相信我需要按客户#,LineOfBusiness和DealYear进行分组。 –

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)