如何从SQL查询返回动态对象

我有一个storeprocdure返回集合的情况,但我没有如何对象结构,因为查询是非常动态的。

一个查询可以返回:

Id | 位置| MarketSegment | …… n列

而另一个可以回来

Id | 销售代表| 位置| 地区| …… n列

我只是简单地返回一个“对象”,如下面的代码所示。 我知道这不会起作用,但是如何设置它呢?

using (DbContext db = new Context()) { var items = db.Database.SqlQuery( "SP @Param1, @Param2", new SqlParameter("Param1", ped), new SqlParameter("Param2", 25) ).ToList(); return Request.CreateResponse<List>(HttpStatusCode.OK, items); } 

编辑:

我不知道无论如何显示SP都会有所帮助,除非我能解释得更多。

每列都表示为自定义字段。 用户可以创建n个自定义字段。 因此,如果您为User1运行SP并且他有5个自定义字段,则每个自定义字段将在列中表示,但如果User2有3个自定义字段,则只表示3列。 我无法控制的是自定义字段名称和自定义字段数。

您不能将SqlQuery用于自定义字段。

创建将返回给定generics类型的元素的原始SQL查询。 类型可以是具有与查询返回的列的名称匹配的属性的任何类型,也可以是简单的基本类型。 – MSDN

但是,您可以使用ExecuteReader来实现这一点。

 using (var db = new Context()) { db.Database.Connection.Open(); var cmd = db.Database.Connection.CreateCommand(); cmd.CommandText = "SP @Param1, @Param2"; cmd.Parameters.Add(new SqlParameter("Param1", ped)); cmd.Parameters.Add(new SqlParameter("Param2", 25)); List> items = new List>(); var reader = cmd.ExecuteReader(); while (reader.Read()) { var item = new List(); items.Add(item); for (int i = 0; i < reader.FieldCount ; i++) item.Add(reader[i]); } return Request.CreateResponse>(HttpStatusCode.OK, items); } 

如果您知道可以返回所有可能的列,那么使用具有比您需要的更多属性的类没有问题。

 public class Data { public int ID {get;set;} public string SalesRep {get;set;}//Simply will be empty in the first example, but populated in the second. public string Location {get;set;} }