2013-03-27 2 views
2

я есть dateSend Колонка и dateEdit Колонка в таблице продукта, я могу выбрать максимальную dateSend с этим кодом:выбрать максимум между двумя столбцами в LINQ

(from pro in Products.ToList() 
select new { pro.DateSend }).Max(); 

, но у меня есть максимум между dateSend и dateEdit, пожалуйста, помогите мне.

+0

Какой тип DateSend? Из вашего замечания ниже я предполагаю, что это 'DateTime?' ... Это правильно? – blins

+0

DateSend = Datetime & DateEdit = Datetime? –

ответ

6
(from pro in Products.ToList() 
let max = Max(pro.DateSend, pro.DateEdit) 
select max).Max() 


static DateTime? Max(DateTime? a, DateTime? b) 
{ 
    if (!a.HasValue && !b.HasValue) return a; // doesn't matter 

    if (!a.HasValue) return b; 
    if (!b.HasValue) return a; 

    return a.Value > b.Value ? a : b; 
} 
+0

Ошибка: объект Nullable должен иметь значение. потому что, dateEdit пуст –

+0

, пожалуйста, помогите мне ... –

+0

@BabakSaeedi: попробуйте обновление –

1
((from pro in Products.ToList() 
select pro.DateSend).Union(
from pro2 in Products.ToList() 
select pro.DateEdit 
)).Max(); 
+2

Зачем проверять коллекцию дважды, когда вы можете легко выбрать более высокий из двух столбцов для каждого элемента? –

+0

Вы правы, это не самый оптимальный способ. Ваш ответ действительно лучший способ сделать это. Добавил мой голос. Привет, друг! – Kenneth

7

Если вы не против канав запроса синтаксиса это проще сделать:

DateTime max = Products.Max(p=>p.DateSend > p.DateEdit ? p.DateSend : p.DateEdit); 
+0

Ошибка: объект Nullable должен иметь значение. потому что dateEdit пуст –

0

Тот же код, но с одним LinQ

(From pro in Products.ToList 
    Let max = {pro.DateSend, pro.DateEdit}.Max 
    select max).Max 

Если про элементы недействительны DateTime, это приведет к сбою или возврату неожиданного результата.

Другое решение (Синтаксический элементов списка продуктов):

(From pro in Products.ToList 
    Let DSend as DateTime = Convert.ToDateTime(Iif(ValidDateTime(pro.DateSend), pro.DateSend, DateTime.MinValue)) 
    Let DEdit as DateTime = Convert.ToDateTime(Iif(ValidDateTime(pro.DateEdit), pro.DateEdit, DateTime.MinValue)) 
    Let MaxDate as DateTime= {DSend, DEdit}.Max 
    select MaxDate).Max 

private function ValidDateTime(ByVal Dat as Object) as Boolean 
    if Dat Is Nothing OrElse IsDbNull(Dat) OrElse String.IsNullOrEmpty(Dat) then 
     return false 
    end if 

    return true 
end function 

Вы можете заменить ValidDateTime с "IIF".

Другие примеры, возвращающие максимальное значение Double items, но в персонализированном объекте (MyObject) элементы являются строковыми.

(From Item as MyObject in MyListOfObject 
    Let Frec as Double = Convert.ToDouble(Iif(String.IsNullOrEmpty(Item.Frecuency),0,Item.Frecuency)) 
    Let Pot as Double = Convert.ToDouble(Iif(String.IsNullOrEmpty(Item.Power),0,Item.Power)) 
    Let max as Double= {Frec, Pot}.Max 
    select max).Max 

Recap

  1. Declare столбцов Items отдельно. Parse It (если вам нужно)
  2. Создайте элемент для хранения максимального значения строки (все столбцы)
  3. Создайте массив, поместите все объявленные элементы и массив asign перед объявленным элементом (элемент, созданный на этапе 2)
  4. Append в конце массива Макс свойство, как это:. {Элемент1, Элемент2, ...} Макс
  5. Создать Выберите FR вернуть Макса предмета
  6. Append в конце концов Макс собственности LINQ , (MyLinQ) .Max

Я надеюсь, что этот код поможет кому-то. Извините за мой английский.

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