gpt4 book ai didi

c# - 仅从 Dapper connection.Query(sql) 返回某些列/字段

转载 作者:行者123 更新时间:2023-11-30 17:04:07 25 4
gpt4 key购买 nike

问题与疑问

问题:我认为 connection.Query<myT>("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<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; }
}

More on DTOs

最佳答案

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

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

关于c# - 仅从 Dapper connection.Query<T>(sql) 返回某些列/字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17926386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com