1. ホーム
  2. c#

[解決済み] LINQ Max() を使用して 1 つの行を選択する

2022-02-16 08:40:49

質問

NHibernate から返された IQueryable で LINQ を使用していますが、いくつかのフィールドで最大値を持つ行を選択する必要があります。

私がこだわっている部分を簡略化してみました。私は1つのフィールドで最大値を持つテーブルから1つの行を選択する必要があります。

var table = new Table { new Row(id: 1, status: 10), new Row(id: 2, status: 20) }

from u in table
group u by 1 into g
where u.Status == g.Max(u => u.Status)
select u

これは不正確なのですが、正しい形がわかりません。

ちなみに、実際に私が実現しようとしているのは、だいたいこんな感じです。

var clientAddress = this.repository.GetAll()
    .GroupBy(a => a)
    .SelectMany(
            g =>
            g.Where(
                a =>
                a.Reference == clientReference && 
                a.Status == ClientStatus.Live && 
                a.AddressReference == g.Max(x => x.AddressReference) && 
                a.StartDate == g.Max(x => x.StartDate)))
    .SingleOrDefault();

上記のラムダから始めたのですが、LINQPadを使ってMax()を選択する構文を試行錯誤しています。

アップデイト

GroupByを削除したことが鍵でした。

var all = this.repository.GetAll();

var address = all
            .Where(
                a =>
                a.Reference == clientReference && 
                a.Status == ClientStatus.Live && 
                a.StartDate == all.Max(x => x.StartDate) &&
                a.AddressReference == all.Max(x => x.AddressReference))
            .SingleOrDefault();

解決方法は?

なぜここでグループ化するのかがわかりません。

これを試してみてください。

var maxValue = table.Max(x => x.Status)
var result = table.First(x => x.Status == maxValue);

を反復する別のアプローチ table は一度だけです。

var result = table.OrderByDescending(x => x.Status).First();

これは、次のような場合に便利です。 tableIEnumerable<T> は、メモリ上に存在しないか、その場で計算されます。