当列都是varchar时,如何使用LINQ获取唯一记录

本文关键字:LINQ 何使用 获取 唯一 记录 varchar | 更新日期: 2023-09-27 17:57:55

我正试图找到一种使用linq从数据库中获取最新记录的方法。表中的所有字段都是varchar2。

例如,我有一张表:

CODE   VERSION   FIELD1   FIELD2 ...
AAA    0.0.1     data1    data2
BBB    0.0.2     data22   xxxxx
AAA    0.0.2     xxcxcx   asdasdas
AAA    0.0.3     data11   data5555
BBB    0.0.2     dasds    aasdasd

我只想回来。

AAA    0.0.3     data11   data5555
BBB    0.0.2     dasds    aasdasd

我可以按CODE/VERSION将所有数据重新排序,然后为每个唯一的代码取前1。然而,这似乎是我在增加开销。有没有更简单的方法来实现这一点?

编辑:我使用的是Oracle 11g。我无法控制当前的DB——字段就是它们的样子。我正在尝试LINQ实体,代码和版本是表的键。

当列都是varchar时,如何使用LINQ获取唯一记录

如果您的需求类似于"每个唯一代码的",这通常意味着您需要使用GroupBy

以下是LINQ To Object的一个工作示例:

var data = new List<MyData>
{
    new MyData { Code = "AAA", Version = "0.0.1", Field1 = "data1", Field2 = "data20" },
    new MyData { Code = "BBB", Version = "0.0.2", Field1 = "data2", Field2 = "data21" },
    new MyData { Code = "AAA", Version = "0.0.2", Field1 = "data3", Field2 = "data22" },
    new MyData { Code = "AAA", Version = "0.0.3", Field1 = "data4", Field2 = "data23" },
    new MyData { Code = "BBB", Version = "0.0.2", Field1 = "data5", Field2 = "data24" },
};
var res = data
    .GroupBy(z => z.Code)   // Group by code
    .Select(z => z
        .OrderByDescending(z2 => z2.Version)
        .FirstOrDefault())  // For each group, select the most recent one. This assumes you can order versions using their textual representation
    .ToList();

编辑

看起来您无法更改Oracle数据库中存储的内容。对VERSION列进行排序可能不起作用(可以假设9.9.9之后不会停止版本控制)

要么在内存中加载所有内容,然后解析VERSION字段,然后排序。您可以编写一个存储过程(或视图),以便在DB服务器上高效地执行此操作。