2016-10-11 6 views
2

У меня есть datatable, который имеет несколько столбцов. Я хочу вернуть тот, который соответствует моему идентификатору, с наибольшим значением в столбце verlabel, в данном случае я хочу, чтобы вернуться 1.1Как получить наивысшее значение из datatable?

Datatable structure

Как этого добиться? Текущий код просто возвращает имя столбца в мою строковую переменную, а не фактическое значение.

Namespace.EnquiryEngine.DataLists ds2 = new Namespace.EnquiryEngine.DataLists("VERSION"); 
Namespace.Common.KeyValueCollection ds2params = new Namespace.Common.KeyValueCollection(); 
ds2params.Add("id", class.ID); 
ds2.ChangeParameters(ds2params); 
System.Data.DataTable dt = ds2.Run(false) as System.Data.DataTable; 
String version = Convert.ToString(dt.Rows[0]["version"]); 

Новый код:

var highestVersion = (from row in dt.AsEnumerable() 
        where row.Field<int>("id") == doc.ID 
        select row.Field<double>("verlabel")).Max(); 
+2

Посмотрите [LINQ к DataTable] (http://stackoverflow.com/questions/10855/linq-query-on-a-datatable) –

ответ

2

не пробовал сам, но, вероятно, что-то вместе:

var highestVersion = (from row in dt.AsEnumerable() 
         where row.Field<string>("id") == class.ID 
         select row.Field<double>("verlabel")).Max(); 
+0

Это будет результат 'double' не' DataRow', как ожидалось –

+0

@MrinalKamboj - ожидаемая на самом деле строка ('String version'), но я решил сохранить ее в двойном порядке. Он может добавить 'ToString()' при необходимости :) –

+1

Мне нравится внешний вид этого ответа - простой и понятный. К сожалению, я получаю исключения о 'System.Data.EnumerableRowCollection ', не содержащем определения для 'max'. Есть идеи? –

2

Другой вариант приведет к DataRow, из которого можно выбрать любую соответствующую Column , если его не Null

var dataRow = dt.AsEnumerable() 
          .Where(row => row.Field<string>("id") == class.ID) 
          .OrderByDescending(row => row.Field<double>("verlabel")) 
          .FirstOrDefault(); 

var result = dataRow?["ColumnName"] 
3

Используйте следующий код:

var res = dt.AsEnumerable().where(a => a.Field<String>("id") == class.ID).Select(b => b.Field<double>>("verlabel").Max(); 
Смежные вопросы