仅从Dapper连接返回某些列/字段.查询<;T>;(sql)

本文关键字:lt gt sql 查询 字段 返回 连接 Dapper 仅从 | 更新日期: 2023-09-27 18:25:17

问题和问题

问题:我认为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存储库类

返回打开的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);
}

创建一个简单的数据传输对象解决了这个问题: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连接返回某些列/字段.查询<;T>;(sql)

这基本上是一个序列化因子。Dapper从不显式地为它在列中没有得到的任何东西赋值。然而,我怀疑如果您序列化new Category(),您会看到非常相似的行为。选项:

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