1

linq-to-entities クエリで、nvarchar 列に対してクエリを実行するときに、短い長さの値の先頭にどのようにスペースを追加しますか?

特定のフィールドの適切なソートを容易にするために、この機能を探しています。

ここに私のシナリオがあります:

事実上すべてのテーブルに部品番号列を含むデータベースがあります。これらの部品番号列は、データベースでは nvarchar(20) として表されます。通常、6 桁と 8 桁の両方の部品番号の組み合わせが含まれています。これらの部分の「数字」の大部分は、実際には数字です。ただし、一部は数値ではありません。したがって、それらは整数ではなく文字列として表されます。

これらの部品番号は数字ではなく文字列として表されるため、適切に並べ替えられません。6 桁と 8 桁の値は、別々にグループ化されるのではなく、混ざり合っています。したがって、並べ替えの問題を解決するために、短い長さの値に先頭のスペースを埋めたいと思います。

これらの列がnvarcharではなくncharとして格納されている場合、このパディングが自動的に取得されることを認識しています。ただし、これらの列のデータ型を変更することは、現時点ではオプションではありません。

独自の linq クエリを作成すると、適切に並べ替えることができます。

db.table.Select(_ => _.partNumberColumn).OrderBy(_ => _.Length).ThenBy(_ => _);

この問題は、他のツール (グリッドなど) がクエリを自動的に作成するときに発生します。次に、追加の並べ替え要件について知りません。したがって、長さが短い値の前にスペースを追加するのが良い解決策のようです。

クエリの例を次に示します。モデルを作成するときは、単に値を入れるのではなく、6 文字の値の前に 2 つのスペースを追加したいと考えています。

_db.HubAssembliesWides
    .Select(_ =>
        new Models.HubAssemblyModel()
        {
            HubAssemblyNumber = _.HubAssemblyNumber,
            DetailedOnNumber = _.DetailedOnNumber,
            HubMachiningNumber = _.HubMachiningNumber,
            HubCastingNumber = _.HubCastingNumber,
            ComponentHubAssemblyNumber = _.ComponentHubAssemblyNumber
        }
    );

だから代わりに

HubAssemblyNumber = _.HubAssemblyNumber

私が欲しい

HubAssemblyNumber = _.HubAssemblyNumber.Length == 6 ? "  " + _.HubAssemblyNumber : _.HubAssemblyNumber

これはできますか?ありがとう!

4

1 に答える 1

2

サプライズ!私が提案した構文が実際に機能することに気づきませんでした。

HubAssemblyNumber = _.HubAssemblyNumber.Length == 6 ? "  " + _.HubAssemblyNumber : _.HubAssemblyNumber

linq-to-entities によって T-SQL に変換されると、caseステートメントに変換されます。

于 2013-04-06T18:08:41.217 に答える