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()代码>:)你可以直接打电话给FindAllAsSetFields
,然后按照你的意愿使用SetFields
!我了解了DTO的方法:)它很长,只是因为我复制了两次代码示例:)关键是:不同的json序列化程序将只调用ToString()
方法,Id将很容易用作字符串(它将被命名为Id
,而不是\u Id
)。使用DTO是可选的,但这是一个好主意。最后,我只使用DataContractJsonSerializer,它对我来说更简单、更简短:)谢谢你;D