製品テーブルにdateSend列とdateEdit列があり、次のコードで最大dateSendを選択できます:
(from pro in Products.ToList()
select new { pro.DateSend }).Max();
しかし、dateSend と dateEdit の間に最大値があります。助けてください。
(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;
}
クエリ構文を捨てることに反対しない場合は、次のようにする方が簡単です。
DateTime max = Products.Max(p=>p.DateSend > p.DateEdit ? p.DateSend : p.DateEdit);
((from pro in Products.ToList()
select pro.DateSend).Union(
from pro2 in Products.ToList()
select pro.DateEdit
)).Max();
同じコードですが、One 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 アイテムの最大値を返す他の例ですが、パーソナライズされたオブジェクト (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
要約
このコードが誰かに役立つことを願っています。私の英語でごめんなさい。