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使用条件排除关键c#

MongoDB ToJson扩展方法的行为有点奇怪——它可以配置,但输出往往很难处理。我建议您使用ServiceStack.TextJavaScriptSerializer作为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;)