asp.net mvc 5 Dapper Json 正在映射整个模型 class

asp.net mvc 5 Dapper Json is mapping the whole model class

我在我的 ASP.NET MVC 5 应用程序中使用 Dapper,在我的查询中我只想要 2 个字段到 return 但 Json return 所有领域。这是我的模型

    public class thread
    {
        [Key]
        public int id { get; set; }
        public int? profileID { get; set; }
        public int numberkeeper { get; set; }
        public int? photocount { get; set; }
}

这是我的控制器..

[ResponseType(typeof(thread))]
    public IHttpActionResult Getstream()
    {

             string Connectionstring = ConfigurationManager.ConnectionStrings["db"].ConnectionString;

             using (System.Data.SqlClient.SqlConnection sqlConnection = new System.Data.SqlClient.SqlConnection(Connectionstring))
             {

                 sqlConnection.Open();
                 var statevi = sqlConnection.Query<thread>("Select top 5 id,numberkeeper from threads").ToList();

                 if (statevi == null)
                 {
                     return NotFound();
                 }
                 return Ok(statevi);

             }
    }

该代码 returns Json 因为它使用的是 .Net Web API,正如您从查询中看到的那样,我只需要 2 个字段 returned。当我 运行 它并看到 Json 它显示所有字段 (4) 并且当然未选择的 2 个字段显示为 null 。我想要 Json 只显示 id 和 numberkeeper

的 returnn

如果您创建的新模型仅公开您要呈现的两个成员,这将阻止 Web API 返回额外的 JSON。

您还可以在将数据加载到使用 LINQ 的新匿名模型后转换数据。

return Ok(statevi.Select(s => new { s.id, s.numberkeeper }));

如果您想保留相同的模型,但不显示空值成员 Web API 允许您配置 JSON 格式以排除空属性。

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore
};

如果您想使用查询中的 2 行或选定的行,则可以使用查询方法和扩展方法... 1. LINQ查询方式

 using (System.Data.SqlClient.SqlConnection sqlConnection = new System.Data.SqlClient.SqlConnection(Connectionstring))
            {

                sqlConnection.Open();
                var statevi = sqlConnection.Query<thread>("Select top 5 id,numberkeeper from threads").ToList();

                if (statevi == null)
                {
                    return NotFound();
                }

                var result = (from d in statevi
                              select new { d.id, d.numberkeeper }).ToList();

                return Ok(result);

            }
  1. 扩展方法:将此语法更改为上述查询方法的结果

    var result = query.Select(d => new { d.Id, d.Title }).ToList();
    

两者都会给出相同的结果。 让我告诉您它是否适合您的项目。

创建 View Model class:

public class ThreadViewModel
{
        public int id { get; set; }
        public int numberkeeper { get; set; }
}

让 Dapper 知道您希望它为您创建 ThreadViewModel

var statevi = sqlConnection.Query<ThreadViewModel>("Select top 5 id,numberkeeper from threads").ToList();

通过这种方式,您既可以查询数据库中的相关属性,又可以 return 将它们发送给客户端(无需 Dapper 使用 nulls 创建完整的对象)。