dapperで複数のリストをマッピングするにはどうすればよいですか

emuuu

User、Order、Projectの3つのクラスがあり、これらは1つのテーブルに格納されています。注文とプロジェクトはどちらもユーザーと:nの関係があります。これを実装するために、これらの関係をマップする2つのクロステーブル(UserOrders、UserProjects)があります。

public class User
{
  public string UserID {get;set;}
  public List<string> Orders{get;set;}
  public List<string> Projects {get;set;}
}

public class Order
{
  public string OrderID {get;set}
  ...
}

public class Project
{
  public string ProjectID {get;set}
  ...
}

ご覧のとおり、Userオブジェクトには、関連するすべてのorderID / projectIDのリストが含まれています。

今、私はこれをDapperで照会したいと思います。私は1つのリストでかなりうまく機能するこのソリューションを持っています。しかし、2番目のリストの完全なユーザーオブジェクトをクエリしようとすると、すべての結果に最初のリストの結果の数が乗算されます。したがって、ユーザーが3つの注文と2つのプロジェクトを受け取った場合、注文リストは問題なく、プロジェクトリストには両方のプロジェクトが3回含まれます。

var lookup = new Dictionary<string, User>();
var multi = dbDapperFM.Query<User, string, string, User>("SELECT u.*, uo.OrderID, up.ProjectID "+
        "FROM User u INNER JOIN UserOrders uo ON u.UserID=uo.UserID "+
        "INNER JOIN UserProjects up ON u.UserID=up.UserID", (u, uo, up) =>
    {
      User user;
      if (!lookup.TryGetValue(m.UserID, out user))
          lookup.Add(u.UserID, user= u);

      if (user.Orders == null)
          user.Orders = new List<string>();
      user.Orders.Add(uo);

      if (user.Projects == null)
          user.Projects = new List<string>();
      user.Projects.Add(up);
      return user;
    }, splitOn: "UserID , OrderID, ProjectID ").AsQueryable();

この問題が発生する理由(2つの内部結合)は理解していますが、実際には解決方法がわかりません。

トニー・ブラン

また、Dapperがこれを自動的に行わないという事実を理解するのに苦労しました。

まず、「splitOn」のカンマ区切りの値についてはよくわかりません。そこには1つの価値しかないと思いました。たとえば、結果セットには「ID」という名前の複数の列があります。

次に、適切な1:N関係を取得するには、追加の手動手順を実行する必要があります。たとえば、参加者とその電話番号を2テーブルで結合しました。それから私はこれをしなければなりませんでした:

private List<Participant> CollapseResultSet(List<Participant> rawdataset)
{
    List<Participant> ret = new List<Participant>();
    if (!rawdataset.Any())
    {
        return ret;
    }
    else
    {
        List<string> partIds = rawdataset.Select(p => p.ID).Distinct().ToList();
        foreach (string pId in partIds)
        {
            Participant tmp = rawdataset.Where(p => p.ID == pId).FirstOrDefault();
            tmp.PhoneNumbers = rawdataset.Where(p => p.ID == pId).Select(n => n.PhoneNumbers[0]).ToList();
            ret.Add(tmp);
        }
        return ret;
    }
}

それがお役に立てば幸いです。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

複数のポートマッピングを使用するECSサービスにApplicationLoad Balancerを使用するにはどうすればよいですか?

分類Dev

Javaを使用してApacheSparkで配列の行を複数の行にフラットマッピングするにはどうすればよいですか?

分類Dev

FeignClientで複数のエンドポイントを使用してマッピングを定義するにはどうすればよいですか?

分類Dev

画像の配列をマッピングするブートストラップグリッドを使用するにはどうすればよいですか?

分類Dev

複数のサービスを1つのKubernetesIngressパスにマッピングするにはどうすればよいですか?

分類Dev

Excelで複数のピリオドを持つテキストをフォーマットするにはどうすればよいですか?

分類Dev

複数のベクトルに基づいてマッピングを作成するにはどうすればよいですか?

分類Dev

複数のHashicorpVaultポリシーをGitHubチームにマッピングするにはどうすればよいですか?

分類Dev

numpyのsearchsorted結果に基づいて「マッピング」マトリックスを作成するにはどうすればよいですか?

分類Dev

オブジェクトの複数のデータをマッピングするにはどうすればよいですか?

分類Dev

Applicative(Haskell)のRoseTreeに関数をマッピングするにはどうすればよいですか?

分類Dev

証明書マッピングエントリを削除するにはどうすればよいですか?

分類Dev

ネストされたマッピングを使用して、複数のインデックスでElasticSearchクエリを実行するにはどうすればよいですか?

分類Dev

同じ音楽を複数のコンピューターにストリーミングするにはどうすればよいですか?

分類Dev

ネストされたデータ構造の一部に関数をマッピングするにはどうすればよいですか?

分類Dev

SpringControllerのリクエストマッピングの「あいまいな」状況を解決するにはどうすればよいですか?

分類Dev

SpringControllerのリクエストマッピングの「あいまいな」状況を解決するにはどうすればよいですか?

分類Dev

Struts 2のselectタグから複数の値をマッピングするにはどうすればよいですか?

分類Dev

Nginxのアップストリームサーバーに場所をマッピングするにはどうすればよいですか?

分類Dev

1つの場所で特殊文字を含む複数のホットストリングを使用するにはどうすればよいですか?

分類Dev

文字列内の複数の文字を単一の文字に効率的にマッピングするにはどうすればよいですか?

分類Dev

マッピングテーブルの複数の行を列にロールアップするにはどうすればよいですか?

分類Dev

複数のDockerを単一のホストマシンの異なるブリッジに接続するにはどうすればよいですか?

分類Dev

マングースの.catchブロックは、複数の場所で同じです。これを回避するにはどうすればよいですか?

分類Dev

パターンマッチングを使用してScalaのリストから重複を削除するにはどうすればよいですか?

分類Dev

ビングマップの画鋲に複数行のテキストを表示するにはどうすればよいですか?

分類Dev

複数のマッピングで同じオブザーバブルを使用するにはどうすればよいですか?

分類Dev

serviceStack.ormliteまたはDapperのマッピングを列タイプに依存させるにはどうすればよいですか?

分類Dev

複数のプロパティをAngular6の配列にマッピングするにはどうすればよいですか?

Related 関連記事

  1. 1

    複数のポートマッピングを使用するECSサービスにApplicationLoad Balancerを使用するにはどうすればよいですか?

  2. 2

    Javaを使用してApacheSparkで配列の行を複数の行にフラットマッピングするにはどうすればよいですか?

  3. 3

    FeignClientで複数のエンドポイントを使用してマッピングを定義するにはどうすればよいですか?

  4. 4

    画像の配列をマッピングするブートストラップグリッドを使用するにはどうすればよいですか?

  5. 5

    複数のサービスを1つのKubernetesIngressパスにマッピングするにはどうすればよいですか?

  6. 6

    Excelで複数のピリオドを持つテキストをフォーマットするにはどうすればよいですか?

  7. 7

    複数のベクトルに基づいてマッピングを作成するにはどうすればよいですか?

  8. 8

    複数のHashicorpVaultポリシーをGitHubチームにマッピングするにはどうすればよいですか?

  9. 9

    numpyのsearchsorted結果に基づいて「マッピング」マトリックスを作成するにはどうすればよいですか?

  10. 10

    オブジェクトの複数のデータをマッピングするにはどうすればよいですか?

  11. 11

    Applicative(Haskell)のRoseTreeに関数をマッピングするにはどうすればよいですか?

  12. 12

    証明書マッピングエントリを削除するにはどうすればよいですか?

  13. 13

    ネストされたマッピングを使用して、複数のインデックスでElasticSearchクエリを実行するにはどうすればよいですか?

  14. 14

    同じ音楽を複数のコンピューターにストリーミングするにはどうすればよいですか?

  15. 15

    ネストされたデータ構造の一部に関数をマッピングするにはどうすればよいですか?

  16. 16

    SpringControllerのリクエストマッピングの「あいまいな」状況を解決するにはどうすればよいですか?

  17. 17

    SpringControllerのリクエストマッピングの「あいまいな」状況を解決するにはどうすればよいですか?

  18. 18

    Struts 2のselectタグから複数の値をマッピングするにはどうすればよいですか?

  19. 19

    Nginxのアップストリームサーバーに場所をマッピングするにはどうすればよいですか?

  20. 20

    1つの場所で特殊文字を含む複数のホットストリングを使用するにはどうすればよいですか?

  21. 21

    文字列内の複数の文字を単一の文字に効率的にマッピングするにはどうすればよいですか?

  22. 22

    マッピングテーブルの複数の行を列にロールアップするにはどうすればよいですか?

  23. 23

    複数のDockerを単一のホストマシンの異なるブリッジに接続するにはどうすればよいですか?

  24. 24

    マングースの.catchブロックは、複数の場所で同じです。これを回避するにはどうすればよいですか?

  25. 25

    パターンマッチングを使用してScalaのリストから重複を削除するにはどうすればよいですか?

  26. 26

    ビングマップの画鋲に複数行のテキストを表示するにはどうすればよいですか?

  27. 27

    複数のマッピングで同じオブザーバブルを使用するにはどうすればよいですか?

  28. 28

    serviceStack.ormliteまたはDapperのマッピングを列タイプに依存させるにはどうすればよいですか?

  29. 29

    複数のプロパティをAngular6の配列にマッピングするにはどうすればよいですか?

ホットタグ

アーカイブ