MongoDB使用条件排除关键c#
本文关键字:排除 条件 MongoDB | 更新日期: 2023-09-27 18:09:39
所以,我一直在使用这个对象
public class OrdenCompra
{
public String Proveedor { get; set; }
public String EmitidaPor { get; set; }
public String NumOrden { get; set; }
public String TipoPago { get; set; }
public String Descuento { get; set; }
public String Recargo { get; set; }
public String Observacion { get; set; }
public List<DetalleOrden> Detalle { get; set; }
public ObjectId Id { get; set; }
public OrdenCompra() { this.Id = ObjectId.GenerateNewId(); }
public OrdenCompra(ObjectId id) { this.Id = id; }
}
我可以使用常规对象,在我的应用程序中没有问题,但我需要将所有数据导出到html文件,如报告。
创建一个html标记,并使用jQuery将json文件中的所有数据放到html中。
我只是用常规的方式来命名
public String JsongetOrdenCompra(String orden)
{
try
{
return this._Collection.FindOneAs<OrdenCompra>(Query.EQ("NumOrden", orden)).ToJson();
}
catch (Exception e)
{
throw new Exception("Error al obtener Orden de Compra. 'n"+e.Message);
}
}
问题是"_id"键,所以json看起来像
{"key":"value", "bla":"bla", "_id":ObjectId("516"d3f86a3e2c814ac7ca180)}
所以我不能解析它…
我知道有SetFields(Exclude("_id"))方式,但我不能使用FindOneAs…
谢谢!
MongoDB ToJson
扩展方法的行为有点奇怪——它可以配置,但输出往往很难处理。我建议您使用ServiceStack.Text
或JavaScriptSerializer
作为Json序列化器,如下所示:
public string JsongetOrdenCompra(String orden)
{
try
{
var data = this._Collection.FindOneAs<OrdenCompra>(Query.EQ("NumOrden", orden));
var s = new System.Web.Script.Serialization.JavaScriptSerializer();
var result = s.Serialize(data);
return result;
// Alternatively, ServiceStack.Text.JsSerializer or
// extension methods like ASP.NET MVC's Json()
}
catch (Exception e)
{
throw new Exception("Error al obtener Orden de Compra. 'n"+e.Message);
}
}
所有这些都不是最佳实践,因为您将所有数据呈现给公众,并且在公众和数据库之间没有额外的验证和确认级别。
更好的方法通常是创建数据传输对象(dto)并映射数据,例如使用AutoMapper
,如下所示:
public class OrdenDTO
{
public String Proveedor { get; set; }
public String EmitidaPor { get; set; }
}
public class OrdenReadDTO : OrdenDTO
{
public ObjectId Id { get; set; }
}
{
...
var data = this._Collection.FindOneAs<OrdenCompra>(Query.EQ("NumOrden", orden));
var dto = AutoMapper.Mapper.DynamicMap<OrdenReadDTO>(dto);
var s = new System.Web.Script.Serialization.JavaScriptSerializer();
var string = s.Serialize(data);
return string;
}
这个想法是OrdenDTO
包含所有可以发送到服务器的信息,OrdenReadDTO
也包含所有可以从服务器读取的数据。通常,ID是只读的。
如果你使用ASP。在asp.net MVC或类似的框架中,通常有一些方法可以处理实际的域对象,例如:
public ActionResult JsongetOrdenCompra(String orden)
{
// Assuming ASP.NET MVC
try
{
var data = this._Collection.FindOneAs<OrdenCompra>(Query.EQ("NumOrden", orden));
var dto = AutoMapper.Mapper.DynamicMap<OrdenReadDTO>(dto);
return Json(dto);
}
catch (Exception e)
{
throw new Exception("Error al obtener Orden de Compra. 'n"+e.Message);
}
}
使用c# DataContractJsonSerializer
首先,将using System.Runtime.Serialization;添加到您的类(和项目)中。
然后将[DataMember]添加到所有属性中,如
[DataMember]
public String Proveedor { get; set; }
[DataMember]
public String EmitidaPor { get; set; }
//and so on
现在在控制器上
ClasesProClean.OrdenCompra Orden = HO.getOrdenCompra(orden);
DataContractJsonSerializer serializer = new DataContractJsonSerializer(Orden.GetType());
System.IO.MemoryStream ms = new System.IO.MemoryStream();
serializer.WriteObject(ms, Orden);
String json = Encoding.Default.GetString(ms.ToArray());
输出:{"Descuento":"5%","Detalle":[{"Cantidad":60,"CodProveedor":"45AB","Precio":600,"Producto":"Betún","Total":36000},{"Cantidad":1000,"CodProveedor":"3D2","Precio":1000,"Producto":"Cera para piso flotante","Total":1000000}],"EmitidaPor":"Mario Cares","Id":{"_increment":8167808,"_machine":10740424,"_pid":5292,"_timestamp":1366114182},"NumOrden":"45","Observacion":"A la brevedad","Proveedor":"Atilio Di Gianmmarino S.","Recargo":"10%","TipoPago":"Contado"}
这就是我要找的,一个可读的json;)