1. ホーム
  2. c#

[解決済み] 最大値かデフォルトか?

2022-04-22 18:04:25

質問

行を返さないLINQクエリからMax値を取得する最良の方法は何でしょうか?もし私が

Dim x = (From y In context.MyTable _
         Where y.MyField = value _
         Select y.MyCounter).Max

クエリが行を返さない場合、エラーが発生します。私は次のようにすることができます。

Dim x = (From y In context.MyTable _
         Where y.MyField = value _
         Select y.MyCounter _
         Order By MyCounter Descending).FirstOrDefault

しかし、このような単純な要求には少し鈍重な感じがします。もっと良い方法があるのでしょうか?

UPDATE: 以下、裏話です。私は子テーブルから次の資格カウンターを取得しようとしています(レガシーシステム、私を始めないでください...)。各患者の最初の資格行は常に1であり、2番目は2、などです。(明らかに、これは子テーブルの主キーではありません)。そこで、患者の既存のカウンタ値の最大値を選択し、それに1を追加して新しい行を作成しています。既存の子値がない場合、クエリは 0 を返す必要があります (したがって、1 を追加するとカウンタ値は 1 になります)。レガシー・アプリケーションがカウンタ値にギャップをもたらす(可能性がある)場合に備えて、子行の生のカウントに頼りたくないということに注意してください。質問を一般的なものにしようとした私が悪いのですが。

どのように解決するのですか?

以来 DefaultIfEmpty はLINQ to SQLで実装されていないので、それが返すエラーで検索してみると 魅惑的な記事 は、集約関数におけるヌルセットについて扱っています。私が見つけたことを要約すると、select の中で nullable にキャストすることで、この制限を回避することができます。私のVBは少し錆びついていますが、私は 思う こんな感じです。

Dim x = (From y In context.MyTable _
         Where y.MyField = value _
         Select CType(y.MyCounter, Integer?)).Max

あるいはC#で。

var x = (from y in context.MyTable
         where y.MyField == value
         select (int?)y.MyCounter).Max();