在linq中选择两列之间的最大值

时间:2013-03-27 21:22:47

标签: c# asp.net linq

我在产品表中有dateSend Column和dateEdit Column,我可以用以下代码选择max dateSend:

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

但我在dateSend和dateEdit之间有最大值,请帮助我。

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:7)

如果您不反对放弃查询语法,则可以更简单:

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

答案 2 :(得分:1)

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

答案 3 :(得分: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

您可以使用“Iif”替换ValidDateTime。

返回Double项的最大值的其他示例,但在个性化对象(MyObject)中,项是String类型。

  (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

<强>小结

  1. 单独声明列项。解析它(如果需要)
  2. 创建一个项目,用于存储行的最大值(所有列)
  3. 创建一个数组,将所有声明的Items和asign数组放入之前声明的项目(在步骤2中创建的项目)
  4. 在数组的末尾附加Max属性,如下所示:{Item1,Item2,...}。Max
  5. 创建选择fr返回最大项目
  6. 追加linq Max属性。 (MyLinQ)。最大
  7. 我希望这段代码对某人有帮助。 抱歉我的英文。