我有多个客户,这些客户是由组ID指定的组的一部分。
我想从相关表中为每个匹配的组成员检索1条记录(某个日期之前的最后一条记录)。
当前,我查询一个组成员列表,然后为每个成员运行另一个查询以从日期中检索最后一条记录。
我想使用一个查询来执行此操作,因为我可以使用组ID提取关联的表记录-但这会返回所有与组关联的记录(错误)。
如果我使用first
或default
,则只会得到找到的第一个组的结果。
我要每个组成员中的 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++;
}
}
答案 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() });