【问题标题】:How find similar records on some conditions in SQL or Linq or Entity Framework如何在 SQL 或 Linq 或实体框架中找到某些条件下的相似记录
【发布时间】:2022-01-17 11:51:06
【问题描述】:

我有一个request 记录表。

这些请求具有各种数据列,例如RequestIdDateAmountPersonId 等。

当两条记录的日期相差两天或更短时(例如12/12/202114/12/2021)或5000 或更小的日期相差Amount(例如545000542000)并且有完全相同的PersonId - 以及类似的其他一些条件 - 它们将被视为similarduplicated 请求。

我想要的是一个提供所有记录的查询和一个名为similar records 的添加列,其中包含所有相似记录的RequestId

RequestId Amount Date PersonId Similar
1 100,000 10/12/2021 63 3,5
2 95,000 12/12/2021 45 NULL
3 43,000 12/12/2021 63 1
4 38,000 15/12/2021 56 NULL
5 100,000 16/12/2021 63 1
6 63,000 25/12/2021 45 NULL

我是 .NET 框架开发人员,我正在使用 Entity Framework 和 Linq 命令。

请注意,我知道我可以使用循环来做到这一点,但我希望它是一个集成命令来产生这样的输出。谢谢。

【问题讨论】:

  • 逻辑上无法完成。假设您有三个金额,5000、10000 和 15000。哪些金额应该被视为“相等”? 100000 都属于一个组,但是 5000 和 15000 不能属于一个组。
  • 对于 5000,相似的列将是 10000 的记录 id 为 10000,相似的列将是 5000,10000 的记录的 id 为 15000,相似的列将是 10000 的记录的 id

标签: sql asp.net entity-framework linq


【解决方案1】:

我希望 EF Core 可以正确翻译这个查询:

var requests = context.Requests.AsQueryable();

var result = requests.Select(r => new 
    {
        r.RequestId,
        r.Amount,
        r.Date,
        r.PersonId,
        Similar = requests
            .Where(o => o.PersonId == r.PersonId && o.RequestId != r.RequestId)
            .Where(o => Math.Asbs(EF.Functions.DateDiffDay(o.Date, r.Date)) <= 2 
                || Math.Asbs(o.Amount, r.Amount)) <= 5000
            )
            .Select(o => o.RequestId)
            .ToArray()
    })
    .ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多