从日期的组最后一条记录中选择每个匹配的结果之一

时间:2018-11-02 02:46:05

标签: c# sql linq

我有多个客户,这些客户是由组ID指定的组的一部分。

我想从相关表中为每个匹配的组成员检索1条记录(某个日期之前的最后一条记录)。

当前,我查询一个组成员列表,然后为每个成员运行另一个查询以从日期中检索最后一条记录。

我想使用一个查询来执行此操作,因为我可以使用组ID提取关联的表记录-但这会返回所有与组关联的记录(错误)。

如果我使用firstdefault,则只会得到找到的第一个组的结果。 我要每个组成员中的 1 条记录。

我的代码(返回组成员的所有相关记录):

  List<Record> rs = (from x in db.Records where (x.Customer.Group == udcg && x.CloseDate < date && x.CloseDate < earlyDate) orderby x.CloseDate descending select x).ToList();

但是我只希望每个人都一个,而不是全部

我现在使用的代码:

var custs = (from x in db.Customers where (x.group == udcg) select new { x.CustomerID }).ToList();
    expected = custs.Count();
    foreach (var cust in custs)
    {
      Record br = (from x in db.Records where (x.Customer.CustomerID == cust.CustomerID && x.CloseDate < date && x.CloseDate < earlyDate)) orderby x.CloseDate descending select x).FirstOrDefault();
      if (br != null)
        {
           total = (double)br.BillTotal;
           cnt++;        
        }
    }

2 个答案:

答案 0 :(得分:0)

我认为这可能有效

db.Customers
    .Where(c => c.group == udcg)
    .Select(c => db.Records
            .Where(r => r.Customer.CustomerID == c.CustomerID)
            .Where(r => r.CloseDate < date)
            .Where(r => r.CloseDate > date.AddMonths(-2))
            .OrderByDescending(r => r.CloseDate)
            .FirstOrDefault())
    .Where(r => r != null)

它被翻译成一个sql查询。这意味着它使用到服务器的一次往返。与foreach循环相比,这在性能上可能有很大的不同。如果您查看生成的sql,它将类似于

SELECT some columns
FROM Customers
OUTER APPLY (
    SELECT TOP (1) some columns
    FROM Records
    WHERE some conditions
    ORDER BY CloseData DESC
    )

就查询本身的性能而言,在这里我不希望出现问题,sql server在优化此格式时应该不会有问题(与您可以编写此查询的其他方式相比)。

答案 1 :(得分:0)

请尝试此操作,评估记录列表。

DateTime certain_date = new DateTime(2018, 11, 1);

List<Record> records = new List<Record>();

var query = records.GroupBy(x => x.Customer.Group).Select(g => new { Group = g.Key, LastRecordBeforeCertainDate = g.Where(l => l.CloseDate < certain_date).OrderByDescending(l => l.CloseDate).FirstOrDefault() });