LinqToSqlOrderByは効果がありません

食べた

私はこのようにGridViewにLinqToSql-DataSourceを使用しています:

                wsv.wsv2DataContext db = new wsv.wsv2DataContext();
                e.KeyExpression = "id";
                e.QueryableSource = (from mitgliedschaft in db.mitgliedschaft

                                     join person in db.person on mitgliedschaft.person_id equals person.id
                                     join institution in db.institution on mitgliedschaft.verein_id equals institution.id

                                     select new
                                     {
                                         vorname = person.vorname,
                                         nachname = person.nachname,
                                         nameVerein = institution.name,
                                         vereinid = mitgliedschaft.verein_id,
                                         id = mitgliedschaft.id,
                                         verbandsMitgliedsNummer = person.verbandsMitgliedsNummer,
                                         strasse = person.strasse,
                                         plz = person.plz,
                                         ort = person.ort,
                                         geburtsdatum = person.geburtsdatum,
                                         geschlechtid = person.geschlechtid,
                                         statusid = mitgliedschaft.statusid,
                                         bezirk_id = mitgliedschaft.bezirk_id,
                                         kreis_id = mitgliedschaft.kreis_id,
                                         person_id = mitgliedschaft.person_id.Value,
                                         deletedFlag = mitgliedschaft.deletedFlag,
                                         stammverein = mitgliedschaft.stammVerein,
                                         eintrittsdatum = mitgliedschaft.eintritt
                                     }).GroupBy(p => p.person_id).Select(p => p.First());
            }

今、私はセレクションを注文したいと思います。最初に「stammVerein」-テーブル「mitgliedschaft」の列が降順であり、テーブル「mitgliedschaft」の列「eintritt」。私はいくつかの方法を試しました:

                wsv.wsv2DataContext db = new wsv.wsv2DataContext();
                e.KeyExpression = "id";
                e.QueryableSource = (from mitgliedschaft in db.mitgliedschaft

                                     join person in db.person on mitgliedschaft.person_id equals person.id
                                     join institution in db.institution on mitgliedschaft.verein_id equals institution.id

                                     orderby mitgliedschaft.stammVerein descending, mitgliedschaft.eintritt

                                     select new
                                     {
                                         ...

                                     }).GroupBy(p => p.person_id).Select(p => p.First());
            }

と:

                wsv.wsv2DataContext db = new wsv.wsv2DataContext();
                e.KeyExpression = "id";
                e.QueryableSource = (from mitgliedschaft in db.mitgliedschaft

                                     join person in db.person on mitgliedschaft.person_id equals person.id
                                     join institution in db.institution on mitgliedschaft.verein_id equals institution.id

                                     select new
                                     {
                                         ...

                                     }).GroupBy(p => p.person_id).Select(p => p.First()).OrderByDescending(stamm => stamm.stammverein).ThenBy(eintritt => eintritt.eintrittsdatum);
            }

と:

                wsv.wsv2DataContext db = new wsv.wsv2DataContext();
                e.KeyExpression = "id";
                e.QueryableSource = (from mitgliedschaft in db.mitgliedschaft

                                     join person in db.person on mitgliedschaft.person_id equals person.id
                                     join institution in db.institution on mitgliedschaft.verein_id equals institution.id

                                     select new
                                     {
                                         ....

                                     }).OrderByDescending(stamm => stamm.stammverein).ThenBy(eintritt => eintritt.eintrittsdatum).GroupBy(p => p.person_id).Select(p => p.First());

しかし、これには何の効果もありません!私はこの種のデータソースとLinqに非常に慣れていません。

誰かが私がこの注文を達成するのを手伝ってもらえますか?

スティーブパイ

グループ化された結果内のアイテムは、その順序を保持しません。順序をどのように考慮したいかに応じて、group byの後、前、および/または後に行う必要がありますFirst...

これを実現するには、SQLをLinq QL(結合など)に置き換えるよりも、EFの関係をナビゲーションプロパティにマップする方が簡単です。

次の基本クエリを使用します。

var query = db.mitgliedschaft
    .GroupBy(m => m.Person); // Group by related entity, not ID

たとえば、group byの後に、Personごとにグループ化されたレコードのセットがあります。最も早い関連レコードを持つ最初の人が必要な場合:

var result = query.OrderByDescending(g => g.Key.mitgliedschafts.Max(stamm => stamm.stammverein)
    .ThenBy(stamm => stamm.eintritt.eintrittsdatum)
    .First();

これは、スキーマとエンティティの関係を大胆に推測していますが、適切なものを見つけるのに役立つことを願っています。私はeintrittが何であるか、そしてそれがあなたの実体モデルにどのように関連しているかを推測することしかできません。

最初のクエリは、グループ化する基本エンティティのみを取得し、関連するエンティティごとにグループ化します。そのグループ化の結果は、キーがPersonであるグループ化されたmitgliedschaftのセットになります。最新のmitgliedschaftsを持つ人によってこれらのグループを注文するにはMax、降順の要求が指定されたコレクション値を使用して、キーに関連付けられたmitgliedschaftsでorderbyを使用します。

Firstその後、私たちにmitgliedschaftsの最初のグループ化されたコレクションを提供します。

次に、最新の人を取得した後、結果のmitgliedschaftsのリストを並べ替える場合は、次のようにします。

var result = query.OrderByDescending(g => g.Key.mitgliedschafts.Max(stamm => stamm.stammverein)
    .ThenBy(stamm => stamm.eintritt.eintrittsdatum)
    .First().OrderByDescending(stamm => stamm.stammverein)
    .ThenBy(stamm => stamm.eintritt.eintrittsdatum)
    .ToList();

OrderBy句の2番目のセットは、選択したグループまたはmitgliedschaftsに適用されます。

目的のビューモデルを作成するには、を挿入して、のSelect()前のmitgliedschaftsからビューモデルを作成しますToList()

ナビゲーションプロパティを使用すると、これはおそらくgroupbyに頼ることなく実行できます。思い切って、このようなものは似たようなものを返すはずです:

var query = db.Person
    .OrderByDescending(p => p.mitgliedschafts.Max(stamm => stamm.stammverien))
    .ThenBy(stamm => stamm.eintritt.eintrittsdatum)
    .SelectMany(p => p.mitgliedschafts)
    .OrderByDescending(stamm => stamm.stammverien)
    .ThenBy(stamm => stamm.eintritt.eintrittsdatum)
    .Select(stamm => new { ... })
    .ToList();

とにかく、うまくいけば、ナビゲーションプロパティがマップされているか、それらを設定できる場合に試すべきことについていくつかのアイデアが得られます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    Railsで宝石のレイアウトを使用するにはどうすればよいですか?

  3. 3

    Chromeウェブアプリのウェブビューの高さの問題

  4. 4

    Ansibleで複数行のシェルスクリプトを実行する方法

  5. 5

    アンドロイド9 - キーストア例外android.os.ServiceSpecificException

  6. 6

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  7. 7

    CSSのみを使用して三角形のアニメーションを作成する方法

  8. 8

    Google Playストア:アプリページにリーダーボードと実績のアイコン/バッジが表示されない

  9. 9

    GoDaddyでのCKEditorとKCfinderの画像プレビュー

  10. 10

    PyCharmリモートインタープリターはプロジェクトタブにサイトパッケージのコンテンツを表示しません

  11. 11

    Windows 7では、一部のプログラムは「ビジュアルテーマを無効にする」レジストリ設定を行いませんか?

  12. 12

    Get-ADGroupMember:このリクエストのサイズ制限を超えました

  13. 13

    Pyusb can't find a device while libusb can

  14. 14

    MySQLでJSON_LENGTHとJSON_EXTRACTを組み合わせる方法は?

  15. 15

    Postmanを使用してファイル付きの(ネストされた)jsonオブジェクトを送信する

  16. 16

    Swiftのブロックのパラメーターに関するドキュメントのマークアップ形式は何ですか?

  17. 17

    Reactでclsxを使用する方法

  18. 18

    追加後、ブートストラップマルチセレクトがテーブルで機能しない

  19. 19

    MongoDB Compass: How to select Distinct Values of a Field

  20. 20

    「埋め込みブラウザのOAuthログイン」を有効にしてコールバックURLを指定した後でも、Facebookのコールバックエラーが発生する

  21. 21

    複数行ヘッダーのJTableヘッダーテキストの折り返し(カスタムTableCellRenderer)

ホットタグ

アーカイブ