我试图找出一种使用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。我无法控制当前数据库中的字段是什么。 我正在尝试LINQ-Entities,代码和版本是表格的关键。
答案 0 :(得分:3)
如果您的要求类似于每个唯一代码的<#34; &#34;,这通常意味着您需要使用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服务器上有效执行此操作的存储过程(或视图)。