多対多によるEFコアライングループ

Ottarl

レポートのリストをテーブルに表示しようとしている多対多の関係テーブルがあります。

私のテーブルは次のようになります。

レポートテーブル:

Id| ReportName |
1 | report 1   |
2 | report 2   |
3 | report 3   |

レポートカテゴリテーブル:

Id| Name     |
1 | General  |
2 | Specific |

ReportMappingジャンクションテーブル:

Id| ReportId | CategoryId |
1 | 1        | 1          |
2 | 1        | 2          |
3 | 2        | 1          |
4 | 2        | 2          |

この例では、レポートに複数のカテゴリを含めることができますが、2つだけですが、1つのレポートに、General、Specific、Test2、Test3、Test4などの5つのカテゴリを含めることができます。

.netコアアプリケーションのテーブル/リストに次の行に沿ってフォーマットを表示したいと思います。

ReportId| Report Name | Report Categories
1       | report 1    | General, Specific
2       | report 2    | General, Specific

これをSQLサーバーとEFコアLINQの両方で機能させるのに問題があります。これを始める方法についての指針はありますか?これまでのところ、テーブルを結合することはできますが、複数のカテゴリを持つレポートの結果を1つの行に連結する方法がわかりません。上記の例のような希望する結果ではなく、以下のようなものが得られます。

ReportId | Report Name | Report Categories
1        | report 1    | General
1        | report 1    | Specific
2        | report 2    | General
2        | report 2    | Specific

助けていただければ幸いです、ありがとう!

Ivan Stoev

説明しているモデルは、EFCoreドキュメントの多対多のPost/Tagモデルとほぼ同じです

したがって、テーブルレコードを表す3つのクラスがあります

public class Report
{
    public int Id { get; set; }
    public string ReportName { get; set; }
    public ICollection<ReportMapping> Mappings { get; set; }  // navigation
}

public class ReportCategory
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<ReportMapping> Mappings { get; set; } // navigation
}

public class ReportMapping
{
    public int Id { get; set; }
    public int ReportId { get; set; }
    public int CategoryId { get; set; }
    public Report Report { get; set; } // navigation
    public ReportCategory Category { get; set; } // navigation
}

DbSetテーブルを表す3秒:

public DbSet<Report> Reports { get; set; }
public DbSet<ReportCategory> ReportCategories { get; set; }
public DbSet<ReportMapping> ReportMappings { get; set; }

そのノートId接合エンティティ(テーブル)内のプロパティ(列)が冗長であるが、ので、既存のデータベースに制約されない場合には、例のようにして構成する複合PKを削除することを検討します

modelBuilder.Entity<ReportMapping>()
    .HasKey(e => new { e.ReportId, e.CategoryId });

でマークされたプロパティにも注意してください// navigationこれらはいわゆるナビゲーションプロパティ用語の定義を参照)であり、関係の終わりを表し、join構造を使用せずにLINQクエリ内の関連データにアクセスできます。「Linqの結合を使用しない」を参照してください。ナビゲート!LINQクエリを作成するためのEF(コア)推奨/推奨方法です。

これがデータベースモデルです。特定の結果タイプを返すクエリが必要なため、その結果を表すクラス(別名、DTO、ViewModelなど)を定義することから始めます。次に例を示します。

public class ReportInfo
{
    public int ReportId { get; set; }
    public string ReportName { get; set; }
    public IEnumerable<string> ReportCategories { get; set; }
}

ReportCategories単一の文字列ではなく、文字列のシーケンスとして定義しいることに注意してくださいこれは、第1に、結果セットの文字列連結がデータベースでネイティブにサポートされていないためです。第2に、コンマとの連結は、このデータを表示できる多くの方法の1つにすぎません。一般に、データのフォーマットはクライアントの責任です。したがって、データを生のネイティブ形式(文字列のリスト)で返し、クライアントにフォーマットさせます(この場合、を使用して簡単に行うことができますstring.Join(",", info.ReportCategories))。

最後に、実際のクエリ。ナビゲーションプロパティを配置すると、非常に簡単になります。基本的には次Selectのとおりです。

var result = db.Reports
    .Select(r => new ReportInfo
    {
        ReportId = r.Id,
        ReportName = r.ReportName,
        ReportCategories = r.Mappings
            .Select(m => m.Category.Name)
            .ToList() // <-- to avoid N + 1 subquery in EF Core 2.1+
    })
    .ToList();

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

efコア多対多関係コントローラー

分類Dev

EFコア-4つのテーブルにわたる多対多の関係

分類Dev

efコアにおける同じタイプの1対1および1対多の関係の両方

分類Dev

EFコアの最新のナイトリービルドと多対多の関係を構築するにはどうすればよいですか?

分類Dev

EFコアの1対多の無限のインクルード

分類Dev

自動マッパーを使用して、多対多の関係を持つDTOを関係テーブルを持つEFコアエンティティにマップするにはどうすればよいですか?

分類Dev

エンティティフレームワーク6コードファーストアプローチで2つのテーブル間に1対多および多対1のマッピングを作成する

分類Dev

1対多によるJava 8のグループ化

分類Dev

多対多対多の関係をグループ化する

分類Dev

Efコア5多対多フィルター

分類Dev

多対多の関係におけるEFコアInclude()

分類Dev

EFコアにおける多対多関係の問題

分類Dev

efコアで多対多の関係を使用している間、自己参照ループを無視する必要が本当にありますか?

分類Dev

最初のEFコード:同じコレクションタイプに対して1対多2回

分類Dev

たとえば、Parse.com RESTクラウドコードに「グループメンバーシップ」を多対多で実装するにはどうすればよいですか?

分類Dev

EFコアで誤ったテーブルデザインを生成するDB移行(AspNetUsersを使用した多対多)

分類Dev

grailsの同じドメインクラスに対して1対多および多対多を作成する

分類Dev

ログイン/ログアウトした時間に対する多対多の関係ユーザー-合計アベイルズ時間のスケーラブルな計算を行う方法は?

分類Dev

カテゴリ内のタイトルによるフィルタリング(多対多)

分類Dev

SQL-ユーザー自身による多対多の関係からレコードを取得します-または-彼のグループ

分類Dev

EFコア-すでに1対多の関係にある同じエンティティに対して多対多を設定する方法

分類Dev

EFコア-多対1のマッピング

分類Dev

EFコア2:多対多のデータベース(リンクテーブル)

分類Dev

コアデータ:多対多の関係にある複数のアイテムの組み合わせのマッチング

分類Dev

LiveDataのある部屋:アダプターの多対多マッピング

分類Dev

EFコア:マップされていないボイラープレートプロパティによるフィルタリング

分類Dev

EFコア:マップされていないボイラープレートプロパティによるフィルタリング

分類Dev

多対多のLINQグループ

分類Dev

一対多リレーションシップJPAの各アイテムのコストを合計するにはどうすればよいですか?

Related 関連記事

  1. 1

    efコア多対多関係コントローラー

  2. 2

    EFコア-4つのテーブルにわたる多対多の関係

  3. 3

    efコアにおける同じタイプの1対1および1対多の関係の両方

  4. 4

    EFコアの最新のナイトリービルドと多対多の関係を構築するにはどうすればよいですか?

  5. 5

    EFコアの1対多の無限のインクルード

  6. 6

    自動マッパーを使用して、多対多の関係を持つDTOを関係テーブルを持つEFコアエンティティにマップするにはどうすればよいですか?

  7. 7

    エンティティフレームワーク6コードファーストアプローチで2つのテーブル間に1対多および多対1のマッピングを作成する

  8. 8

    1対多によるJava 8のグループ化

  9. 9

    多対多対多の関係をグループ化する

  10. 10

    Efコア5多対多フィルター

  11. 11

    多対多の関係におけるEFコアInclude()

  12. 12

    EFコアにおける多対多関係の問題

  13. 13

    efコアで多対多の関係を使用している間、自己参照ループを無視する必要が本当にありますか?

  14. 14

    最初のEFコード:同じコレクションタイプに対して1対多2回

  15. 15

    たとえば、Parse.com RESTクラウドコードに「グループメンバーシップ」を多対多で実装するにはどうすればよいですか?

  16. 16

    EFコアで誤ったテーブルデザインを生成するDB移行(AspNetUsersを使用した多対多)

  17. 17

    grailsの同じドメインクラスに対して1対多および多対多を作成する

  18. 18

    ログイン/ログアウトした時間に対する多対多の関係ユーザー-合計アベイルズ時間のスケーラブルな計算を行う方法は?

  19. 19

    カテゴリ内のタイトルによるフィルタリング(多対多)

  20. 20

    SQL-ユーザー自身による多対多の関係からレコードを取得します-または-彼のグループ

  21. 21

    EFコア-すでに1対多の関係にある同じエンティティに対して多対多を設定する方法

  22. 22

    EFコア-多対1のマッピング

  23. 23

    EFコア2:多対多のデータベース(リンクテーブル)

  24. 24

    コアデータ:多対多の関係にある複数のアイテムの組み合わせのマッチング

  25. 25

    LiveDataのある部屋:アダプターの多対多マッピング

  26. 26

    EFコア:マップされていないボイラープレートプロパティによるフィルタリング

  27. 27

    EFコア:マップされていないボイラープレートプロパティによるフィルタリング

  28. 28

    多対多のLINQグループ

  29. 29

    一対多リレーションシップJPAの各アイテムのコストを合計するにはどうすればよいですか?

ホットタグ

アーカイブ