Dapper接続から特定の列またはフィールドのみを返します。クエリ (sql)

c# dapper serialization web-services

質問

問題と質問

問題:私はconnection.Query<myT>("Select A, C from myTable");選択された列と、基礎をなすクラス/オブジェクトの一致するフィールドのみが埋められます。しかし、これは事実ではないようです - (理由は私の誤用かもしれませんが、どうやって結果をシリアライズするのかも)。現在、基礎となるクラスのすべてのフィールドは、シリアル化された結果になります。

質問: selectに基づいて特定のプロパティのみを返し、それらをシリアル化するにはどうすればよいですか?

セットアップ

はdapperを見て 、次のことをまとめました。

エンティティ/モデルの簡単なクラス:

public sealed class Category 
{
    public int Id { get; set; }
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
    public DateTime DateAdded { get; set; }
    public DateTime DateModified { get; set; }
}

IDbConnectionとDapper Repositoryクラス

開いているIDbConnection返します。

protected static IDbConnection OpenConnection()
{
    IDbConnection connection = new SqlConnection(ConnectionString);
    connection.Open();
    return connection;
}

リポジトリクラスでdapperを使って上記の接続を使用する

public IEnumerable<Category> GetCategories()
{
    using (IDbConnection connection = OpenConnection())
    {
        const string sql = " SELECT Id, A, C FROM Categories";
        return connection.Query<Category>(sql);
    }
}

結果をシリアル化し、クライアントにAsmxによって送信します。

[WebMethod]
public string GetCategoriesTreelist()
{
    var repo = new CategoryRepository();
    IEnumerable<Category> categories = repo.GetCategories();            
    var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    return serializer.Serialize(categories);
}

出力

現在、すべてのフィールドは、上記のSQL文の選択されたフィールドだけではなく、シリアル化されています。

  • いくつかのフィールドだけを再試行するにはどうすればよいですか?
  • すべてのフィールドが、dapperまたはSystem.Web.Script.Serialization.JavaScriptSerializer()基づいて、または私の誤解/誤用に基づいてシリアル化される理由はありますか?

ありがとう

マークが質問に答えた後の更新

木のための森がない:Marcのように、Dapperは直列化によってオブジェクトのすべてのメンバーが返されるわけではないという。この簡単なテストは、基礎をなすクラスのすべてのメンバーが直列化されていることを示しています。

[WebMethod]
public string GetCategoriesTestObjectSerialization()
{

    List<Category> categoriesList =  new List<Category>(){
        new Category(){Id=1, A="a1", C="foo"},
        new Category(){Id=2, A="a2", C="bar"},
        new Category(){Id=3, A="a3", C="baz"}
    };
    IEnumerable<Category> categories= from c in categoriesList 
                                                where c.Id > 0
                                                select c;
    var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    return serializer.Serialize(categories);
}

単純なデータ転送オブジェクトを作成すると、問題が解決さIEnumerable<CategoryDTO> categories= from c in categoriesList where c.Id > 0 select c;

private class CategoryDTO
{
    public int Id { get; set; }
    public string A{ get; set; }
    public string C{ get; set; }
}

DTOの詳細

受け入れられた回答

これは基本的にシリアライザの要素です。 Dapperは、列で取得できないものは明示的に割り当てません。しかし、私はnew Category()をシリアライズすると非常によく似た動作をするだろうと思う。オプション:

  • それと一緒に生きる
  • あなたが望むものに合ったDTOモデルを作成し、代わりにそれに照会してください
  • シリアライザが条件付きシリアル化をサポートしているかどうかを調べます(しかし、これは多くの定型文を必要とすることに注意してください)


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ