リポジトリで Dapper を使用して、クエリの結果を API が返す DTO タイプのリストにマップしています。すべてが正しく機能しているように見えますが、クエリとマッピングが終了すると、正しい数のオブジェクトがリストに入力されますが、int プロパティはすべて 0 で、文字列は null です。私は他のプロジェクトで Dapper をかなり使用してきましたが、これまでにこれに遭遇したことはありません。また、データが正しいことも確認しました。クエリを SQL Management Studio にコピーすると、正しいデータが得られます。
カスタム マッピング ロジックを含むリポジトリ基本クラスのコンストラクタを次に示します。このコードがヒットすることを確認しました。
static BaseRepository()
{
SqlMapper.SetTypeMap(typeof(T),
new CustomPropertyTypeMap(
typeof(T), (type, columnName) => type.GetProperties()
.FirstOrDefault(prop => prop.GetCustomAttributes(false)
.OfType<ColumnAttribute>()
.Any(attr => attr.Name == columnName))));
}
リストを作成するためのリポジトリ メソッドは次のとおりです。
public IEnumerable<Dog> GetAll()
{
var dogs = Db.Query<Dog>(@"SELECT Id, Name FROM Dogs");
return dogs;
}
そして、ここに私の目的があります:
[DataContract]
public class Dog
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
}
したがって、「dogs」変数が入力されることを確認しましたが、Id 要素と Name 要素はすべて 0 または null です。最終的な JSON の結果は次のようになります。
[
{
Id: 0,
Name: null
},
{
Id: 0,
Name: null
},
{
Id: 0,
Name: null
}
]
のような列属性をプロパティに追加することも試みました[Column(Name = "Id")]
。まだ運がありません。私は何を見落としていますか?
編集:この関連する回答 のサンプルコードと要点を使用して、この問題を解決できました。