我使用以下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,然后将该日期用于我的过滤器。我不确定如何在这里做同样的事情。
答案 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;