2016-03-31 15 views
11

で最も早い日付を取得します。しかし、プロダクトはコレクションなので、多くの日付があります。上記は最初のものを選択するだけです。私はWebAPIのコントローラで、次のLINQを持つLINQ式

私が本当にやりたいことは、最も早い時期に日付を見つけて、それを選択することです。

どのように見えますか?

+0

'.FirstOrDefault()'はnullを返すことができます。 '.Date'を実行すると、あなたのコードはNullReferenceExceptionsに対して脆弱です。製品のリストが空の場合はそれを確認してください。また、使用している答えに注意し、空のリストでテストしてください。同じ問題がそこに存在する可能性が最も高いでしょう。 – ANeves

答えて

14

MaxまたはMinを使用すると少し明確になります。

MyDate = i.Products.Select(x => x.Date).Max() 

実際に製品をご希望の場合は、日付で並べ替えてから最初のものを選択する必要があります。

MyProduct = i.Products.OrderBy(x => x.Date).FirstOrDefault() 
+4

注文は高価な操作であり、必要でないときに使用すべきではありません。 最近の日付が最も古い製品のクエリは、 'Product oldestProduct = i.Products.SingleOrDefault(x => x.Date == i.Products.Min(y => y.Date));'または'DateTime minDate = i.Products.Min(x => x.Date);製品oldestProduct = i.Products.SingleOrDefault(x => x.Date == minDate); ** **注:**後者のバージョンは読みやすくなりますが、別々の2つのクエリが必要です。 –

+2

@SørenD.Ptæus注文のコストは、注文の仕方によって異なります。それがデータベースにアクセスしていて、日付の順序付けされたインデックスがある場合、かなり安くなるでしょう。 –

+1

注意: '.Max()'や '。Min() 'は空のコレクションで例外をスローします! – ANeves

1

は、単に日付順:

MyDate = i.Products.OrderBy(x => x.Date).Select(x => x.Date).FirstOrDefault(); 
2

あなたは次のようになり

i.Products.OrderByDescending(x => x.Date).FirstOrDefault().Date; 
+0

これはあなたに最大の(最近の)日付を与えるでしょう – bit

+0

* OrderByAscending * – bit

+0

はい、私はちょうどそれを実現した –

1

最適化された方法を使用することができます:あなたは日付だけではなく製品全体たい場合

i.Products.OrderByDescending(x => x.Date).Select(x => x.Date).FirstOrDefault(); 
1
i.Products.OrderBy(x => x.Date).FirstOrDefault().Date; 

それはorderbyのではなくorderbydescendingなければなりません。 orderbydescendingはあなたに最も新しい日付を最初に与えます。

3

この方法では、より簡潔である:

var earlyDate = i.Products.Min(p=>p.Date); 

しかし、あなたはここでProduct != null

2

はあなたに最小(早い)日付

DateTime earliestDate = i.Products.Min(p => p.Date); 
1

シンプルを与えるラムダ式であることを確信していますあなたが最も早く使用する必要がある場合は、OrderByと、最も古いものを必要とする場合はOrderByDescendingを使用してください。

i.Products.OrderBy(x => x.Date).Select(x => x.Date).FirstOrDefault(); 
i.Products.OrderByDescending(x => x.Date).Select(x => x.Date).FirstOrDefault(); 
関連する問題