Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MongoDB使用条件排除键C_C#_Mongodb_Projection - Fatal编程技术网

C# MongoDB使用条件排除键C

C# MongoDB使用条件排除键C,c#,mongodb,projection,C#,Mongodb,Projection,所以,我一直在使用这个物体 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

所以,我一直在使用这个物体

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; }
    }
公共类或公共类
{
公共字符串Proveedor{get;set;}
公共字符串EmitidaPor{get;set;}
公共字符串numoden{get;set;}
公共字符串TipoPago{get;set;}
公共字符串descentito{get;set;}
公共字符串Recargo{get;set;}
公共字符串Observacion{get;set;}
公共列表Detalle{get;set;}
公共对象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);
            }
        }
公共字符串JsongetOrdenCompra(字符串orden)
{
尝试
{
返回此.u Collection.FindOneAs(Query.EQ(“NumOrden”,orden)).ToJson();
}
捕获(例外e)
{
抛出新异常(“错误al obtener Orden de COMPA.\n”+e.Message);
}
}
问题在于“_id”键,因此json看起来像

{“key”:“value”,“bla”:“bla”,“_id”: ObjectId(“516d3f86a3e2c814ac7ca180”)}

所以我无法解析它

我知道有设置字段(Exclude(“_id”))方式,但我不能与FindOneAs一起使用


谢谢

MongoDB
ToJson
扩展方法的行为有点奇怪-它可以配置,但输出往往很难使用。我建议您使用或
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);
    }
}
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;
}
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);
    }
}
其思想是,
OrdenDTO
包含可以发送到服务器的所有信息,
OrdenReadDTO
还包含可以从服务器读取的所有数据。通常,ID是只读的

如果您使用的是ASP.NET MVC或类似的框架,通常有一些方法可以处理实际的域对象,如:

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);
    }
}
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;
}
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);
    }
}
PublicActionResult JsongetOrdenCompra(字符串orden)
{
//假设ASP.NETMVC
尝试
{
var data=this.\u Collection.FindOneAs(Query.EQ(“NumOrden”,orden));
var dto=AutoMapper.Mapper.DynamicMap(dto);
返回Json(dto);
}
捕获(例外e)
{
抛出新异常(“错误al obtener Orden de COMPA.\n”+e.Message);
}
}
最终使用C#DataContractJsonSerializer

首先,使用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;)

为什么要排除该id?C#驱动程序会自动将Bson中的
\u id
字段映射到您的
id
属性,这样就不会有问题了?你能更具体地描述一下这个问题吗?@mnemosyn问题是“_id”键,所以json看起来像{“key”:“value”,“bla”:“bla”,“_id”:ObjectId(“516d3f86a3e2c814ac7ca180”)},所以我无法解析它……你在哪里解析json?为什么不使用实际的C#object呢?该方法的调用方是什么?@mnemosyn刚刚编辑了帖子。我需要使用jQuery在html页面中使用数据。这就是为什么我要进行从对象到字符串的转换,JSonfinodeas只是
FindAllAs
的包装器。整个函数就是这样:
returnfindallas().SetLimit(1.FirstOrDefault():)你可以直接打电话给FindAllAs
SetFields
,然后按照你的意愿使用
SetFields
!我了解了DTO的方法:)它很长,只是因为我复制了两次代码示例:)关键是:不同的json序列化程序将只调用
ToString()
方法,Id将很容易用作字符串(它将被命名为
Id
,而不是
\u Id
)。使用DTO是可选的,但这是一个好主意。最后,我只使用DataContractJsonSerializer,它对我来说更简单、更简短:)谢谢你;D