2016-06-22 10 views
0

にこんにちは、私は以下のクラス(簡体字)を持っている私はDapperのマッププロパティ

Member.cs

public string FirstName { get; set; } 
public string LastName { get; set; } 
public Place Address { get; set; } 

Place.cs

public string Address{ get; set; } 
public string City { get; set; } 
public string PostalZip { get; set; } 

にマッピングするDapperの欲しいです私はSQLサーバーから得る応答:

Id FirstName LastName AddressAddress  AddressCity 
----------------------------------------------------------------------------- 
113  First  Last  Some Address  Some City 

私はこの実行:

var members = session.Connection.Query<Member>(dataQuery, p, transaction).ToList(); 

それだけで罰金メンバーの一部をマッピングしますが、メンバー(place.cs)のAddressプロパティは、マップされていないままで、どのように私はそれをマッピングする方法をDapperの伝えるためには? PostalZipプレイスタイプではなく、おそらく単純な文字列このクエリはIEnumerable<Member>変数にMembersテーブルのすべてのレコードを返し

using (IDbConnection connection = OpenConnection()) 
{ 
    string query = @"SELECT Id,FirstName,LastName, 
        0 as splitterID, Address, City, PostalZip 
        FROM Members"; 
    var result = connection.Query<Member, Place, Member>(query, (mb, pl) => 
    { 
     mb.Address = pl; 
     return mb; 
    }, 
    splitOn: "splitterID"); 
} 

として、あなたのDapperのクエリを行うことができないと仮定すると

+0

PostalZipが住所と同じ型を持っているのはなぜ? (場所) – Steve

+0

それはタイプミスです: –

答えて

0

。 IEnumerable(メンバ)の各要素は、Addressフィールド、Addressフィールド、Cityフィールド、PostalCodeフィールドをレコードの2番目の部分から抽出したアドレスフィールドを持っています。

トリックは、Queryメソッドに渡されるラムダ式にあります。ここでは、それがFuncであると宣言して、Dapperの内部メンバーから返されたメンバーをメンバーと場所から受け取っています。
Dapperライブラリは、パラメータsplitOnで定義された偽のフィールドsplitterIDを見つけ、このインスタンスをメンバーインスタンスとともにラムダに渡すと、プレイスタイプのインスタンスを作成する必要があることを理解しています。

ラムダ式は、PlaceのインスタンスをMemberインスタンスのAddressプロパティに割り当て、正しく初期化された同じMemberインスタンスを返します。

(私はアドレスフィールドに直接分割することができませんでしたし、偽のフィールドなしでそれを行う方法があるかどうか知りたいだろう)

+0

ありがとう、それは素晴らしいと良い説明を働いています。 Place内に別のオブジェクトをマップすることは可能ですか?私は、データベース内の空間ジオ型として格納されている場所内のポイントを持って、私は可能性があります緯度を抽出する可能性があると思っていた、SQLからlngとポイントオブジェクトを作成しました。 –

+0

はいこれは可能ですが、_splitterfield_をsplitOnパラメータに複数追加してカンマで区切ることができます。また、Queryメソッドに渡されたFuncは、2つ以上の型を受け取ります(何が限界であるかわかりません)。すべては、クエリによって取得されたフィールドとそれらの関係によって決まります( 'List Address'をメンバークラス – Steve

+0

すばらしい答えをありがとう –