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

Customer、LineOfBusiness、DealYear 和 VersionDate 的组合构成了交易块的“版本”概念。上面的数据描述了具有以下促销 ID 的两个版本:

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

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

因此,当更新此交易块时,p103删除了带有 PromoID 的交易。

我有一个屏幕,我只想显示一组交易的最新版本。我想出了以下内容,我认为这是有效的,但实际上有一个错误:

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 记录?

更新

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

4

4 回答 4

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
于 2013-08-19T13:42:26.680 回答
1

这适用于 Linq to 对象,不确定与 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)
于 2013-08-19T13:50:22.757 回答
1

好的,如果我理解正确,p103 被删除,因为它VersionDate不是表中的最大值。所以这意味着当表有new时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
于 2013-08-19T13:23:58.900 回答
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;
于 2013-08-19T13:29:58.533 回答