【问题标题】:Return only certain columns / fields from Dapper connection.Query<T>(sql)从 Dapper connection.Query<T>(sql) 仅返回某些列/字段
【发布时间】:2013-07-29 09:09:36
【问题描述】:

问题和问题

问题: 我认为connection.Query&lt;myT&gt;("Select A, C from myTable"); 只会填充选定的列和基础类/对象的匹配字段。但似乎情况并非如此 - (尽管原因可能是我的误用或我如何序列化结果)。目前底层类的所有字段都在序列化结果中。

问题:我可以做些什么来根据选择只返回某些属性并序列化它们?

设置

基于A look at 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 存储库类

返回一个打开的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 回答问题后更新

只见树木不见森林:就像 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);
}

创建一个简单的Data Transfer Object 解决了这个问题:IEnumerable&lt;CategoryDTO&gt; categories= from c in categoriesList where c.Id &gt; 0 select c;

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

More on DTOs

【问题讨论】:

    标签: c# web-services serialization dapper


    【解决方案1】:

    这基本上是一个序列化程序因素。 Dapper 明确地从不分配给它在列中没有得到的任何东西。但是,我怀疑如果您序列化 new Category(),您会看到非常相似的行为。选项:

    • 忍受它
    • 创建一个适合您想要的 DTO 模型,并改为查询该模型
    • 调查序列化程序是否支持条件序列化(但请注意,这可能需要大量样板文件)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多