簡體   English   中英

當列全為varchar時如何使用LINQ獲取唯一記錄

[英]How to get unique records using LINQ when columns are all varchar

我試圖找出一種使用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,而代碼和版本是表的關鍵。

如果您的要求類似於“ 每個唯一的代碼 ”,則通常意味着您需要使用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字段,然后進行排序。 您可以編寫存儲過程(或視圖)來有效地在數據庫服務器上執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM