次のコードを使用して、データベース内のフィールドから最大数を取得しようとしています:
var bb=(from c in Office_TBLs select c.CodeNumber).Max();
クエリを実行すると、データベース内の最大数が 1601 であるため、間違った結果 "999" が返されます。データベースのフィールドでデータ型が Nvarchar であることは重要ですか?
正しい最大数を取得するためにコードを修正するにはどうすればよいですか。
"999" > "1601"
文字列比較として - 結果を得るには、文字列値を数値に変換する必要があります。
最も簡単な方法は、通常の文字列比較を使用する代わりに.Select(s => int.Parse(s)).Max())
(or ) を使用することです。.Max(s => int.Parse(s))
.Max()
データの取得元によっては、整数の結果を取得するためのはるかに優れた方法があることに注意してください (データベースのフィールド タイプの変更を含む)。.Select
on queryを使用すると、クエリが DB からすべての行を返し、メモリ内の Max を計算するだけである可能性が高くなります。
LINQ to SQL を使用しているConvert.ToInt32
ため、文字列から数値への変換に使用する必要があるため、クエリは次のようになります。
var bb =(from c in Office_TBLs select Convert.ToInt32(c.CodeNumber)).Max();
参照:標準クエリ演算子の変換
C# のキャストは、プロジェクションでのみサポートされています。他の場所で使用されているキャストは変換されず、無視されます。SQL 関数名は別として、SQL は実際には、共通言語ランタイム (CLR) の Convert と同等のものしか実行しません。つまり、SQL はある型の値を別の型に変更できます。同じビットを別の型のビットとして再解釈するという概念がないため、CLR キャストに相当するものはありません。そのため、C# キャストはローカルでのみ機能します。リモートではありません。
を使用NVarChar
すると、値をアルファベット順に並べ替えるように求められます。「1601」の後に「999」が来るように、「HUGS」の後に「ZZZ」が来ます。
列に数値のみが含まれていると想定されている場合、最善の解決策は、データ型をより適切な選択肢に変更することです。
これを試して
var bb=(from c in Office_TBLs select (e => e.CodeNumber).Max())