3

LINQ クエリで呼び出すテーブル値関数があります。
私が理解しているように (ここで参照されているように)、並べ替えはテーブル値関数の外で行う必要があります。つまり、LINQ クエリで実行する必要があります。

構文に関する支援が必要です。これが関数への元の呼び出しです。

var sourceQuery = (from f in db.fGameListDataTable(competitionID, eventID,  participantType)
                   select f); 

このカスタム ソートを SQL クエリから取得し、それを LINQ クエリに追加する必要があります。

Order By 
    CASE 
        WHEN GameType = 'G' THEN '1'
        WHEN GroupNumber = '1' THEN '2'
        WHEN GroupNumber = '2' THEN '3'
        WHEN GroupNumber = '3' THEN '4'
        WHEN GroupNumber = '4' THEN '5'
        WHEN GameType = 'GT' THEN '6'
        WHEN GameType = 'P' THEN '7'
        WHEN GameType = 'FT' THEN '8'   
    END ASC,
    g.GameID ASC

アップデート

視覚的な参照として、並べ替えられたテーブルを次に示します。順序に注意してください。

ここに画像の説明を入力

4

4 に答える 4

4

大きな条件式を作成できます。残念ながら、8 レベルのネスティングが行われます (ヤバイ!)。

var ordered = (from f in ... select ...)
    .OrderBy(f =>
        f.GameType == 'G' ? 1
    :   f.GroupNumber == '1' ? 2
    :   f.GroupNumber == '2' ? 3
    :   f.GroupNumber == '3' ? 4
    :   f.GroupNumber == '4' ? 5
    :   f.GameType == 'GT'   ? 6
    :   f.GameType == 'P'    ? 7
    :   f.GameType == 'PT'   ? 8
    :   9
    );
于 2015-07-19T00:30:23.083 に答える
0

あなたが説明した条件に基づいてDBエンジンを使用してその数を生成できない理由はまだわかりません。

これは既にサンプル コードとして提供されています。

Order By 
    CASE 
        WHEN GameType = 'G' THEN '1'
        WHEN GroupNumber = '1' THEN '2'
        WHEN GroupNumber = '2' THEN '3'
        WHEN GroupNumber = '3' THEN '4'
        WHEN GroupNumber = '4' THEN '5'
        WHEN GameType = 'GT' THEN '6'
        WHEN GameType = 'P' THEN '7'
        WHEN GameType = 'FT' THEN '8'   
    END ASC,
    g.GameID ASC

さて、テーブル値関数内にこの正確なコードを入れたくない(またはできる)ことは理解していますが(リンクに従って、関数の外にある必要があります)、ステートメントORDER BYをまだ持つことができると確信していますCASE追加の列を生成します。

ただし、サーバー上で ORDER BY する必要があると言っているわけではありません。CASE ステートメントを使用して追加の列を生成するだけで、その列を LINQ クエリの order by として使用できるようになります。

以前のコメントで、余分な列を追加することについて言及したとき、私は単なる連続した列を意味するのではなく、上で書いたことを意味していました. その余分な列の値は、まったく同じロジックに基づいていますが、LINQ クライアント側で実装しようとするのではなく、サーバー上で生成されます。

よろしく

編集:

テーブル値関数内でどのように表示されるかを示すコード スニペットを次に示します。

INSERT INTO @Table
  SELECT EventID, GameID, [all you other columns],
    CASE 
        WHEN GameType = 'G' THEN '1'
        WHEN GroupNumber = '1' THEN '2'
        WHEN GroupNumber = '2' THEN '3'
        WHEN GroupNumber = '3' THEN '4'
        WHEN GroupNumber = '4' THEN '5'
        WHEN GameType = 'GT' THEN '6'
        WHEN GameType = 'P' THEN '7'
        WHEN GameType = 'FT' THEN '8'   
    END
  FROM [Whatever you pull your columns from]

これは単なる例であり、実際のコードではありません。

于 2015-07-19T14:50:30.947 に答える