2016-07-20 2 views
0

Я пытаюсь выяснить способ использования linq для получения последних записей из базы данных. Все поля в таблице - varchar2.Как получить уникальные записи, используя LINQ, когда столбцы все varchar

Например, у меня есть таблица:

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 для каждого уникального кода. Однако похоже, что я добавляю накладные расходы. Есть ли более простой способ сделать это?

EDIT: Я использую Oracle 11g. Я не контролирую текущую БД, поля - это то, что они есть. Я пытаюсь LINQ-сущности, а код и версия - это ключи к таблице.

+1

Linq-To-What, f.e. Linq-To-Сущности? Каков ключ, 'CODE' или несколько столбцов? ** Изменить **, поскольку кажется, что оракул я думаю, что вы используете 'Linq-To-Entities' –

+0

Кроме того, поскольку столбец' VERSION' имеет решающее значение для заказа, вы должны реорганизовать свою модель. Создайте 'MajorVersion',' MinorVersion', 'Revision' int-columns и упорядочение прост. –

+0

Заказ по версии будет проблемой, если вы можете иметь значения, такие как 0.0.10, как это было бы раньше 0.0.2 лексически. Лучшим решением было бы разделить части версии на отдельные столбцы, если это возможно. В противном случае вы смотрите на то, чтобы вытащить все данные обратно и сделать это в коде или очень неэффективном SQL-запросе. – juharr

ответ

3

Если ваше требование является чем-то вроде «для каждого уникального кода», это обычно означает, что вам необходимо использовать GroupBy.

Вот рабочий пример для LINQ-объект:

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(); 

EDIT

Похоже, вы не можете изменить то, что вы хранить в базе данных Oracle. Сортировка в столбце VERSION, вероятно, не будет работать (можно предположить, что вы не прекратите управление версиями после 9.9.9).

Либо вы загружаете все в память, а затем разбираете поле VERSION, а затем сортируете. Либо вы пишете хранимую процедуру (или представление), которая эффективно делает это на сервере БД.

+1

Старая проблема: '0.0.10' приходит до' 0.0.2' –

+0

@TimSchmelter Да , это, очевидно, работает только в том случае, если вы можете сортировать версии, используя их текстовое представление. – ken2k

+0

Он работает только в том случае, если ни майор, ни минорверсия, ни пересмотр никогда не превысят 9. Так что это временная бомба :) –

Смежные вопросы