问题:我认为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
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);
}
}
[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语句中的选定字段。
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);
}
创建一个简单的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; }
}
答案 0 :(得分:2)
这基本上是一个序列化因素。 Dapper明确地从不指定任何它不会在列中获取的内容。但是,我怀疑如果序列化new Category()
,您会看到非常相似的行为。选项: