C# MVC5构建一个动态匿名对象

C# MVC5构建一个动态匿名对象,c#,jquery,asp.net-mvc,C#,Jquery,Asp.net Mvc,我正在开发一个MVC5应用程序,试图允许用户编写自己的查询并在Jquery数据表中显示结果。我很难弄清楚如何根据用户输入动态构建匿名JSON对象 理论上,用户将发送列列表和where子句来构建SQL查询。 我会像这样运行SQL查询,并构建我的对象 如何根据用户输入的内容动态构建这个“selectnew{DT_RowId=a.id,name=a.name,number=a.number}” var v = (from a in dc.Products.SqlQuery(querystring) s

我正在开发一个MVC5应用程序,试图允许用户编写自己的查询并在Jquery数据表中显示结果。我很难弄清楚如何根据用户输入动态构建匿名JSON对象

理论上,用户将发送列列表和where子句来构建SQL查询。 我会像这样运行SQL查询,并构建我的对象

如何根据用户输入的内容动态构建这个“selectnew{DT_RowId=a.id,name=a.name,number=a.number}”

var v = (from a in dc.Products.SqlQuery(querystring) select new { DT_RowId = a.id, name = a.name, number = a.number }).ToList();
最终JSON响应是

数据“:[{“id”:56,“名称”:“产品55”,“编号”:“55”}]

硬编码时工作正常。否则,我将不得不从产品中选择*,然后在客户端显示/隐藏列,因此,如果所有列都从服务器返回,那么我的数据负载将非常大

有没有办法循环通过请求的属性来构建这个匿名对象?我尝试使用一个字典,但是返回的Json非常不同,它有键和值,这不是DataTables所期望的

谢谢

完整控制器代码

using (DataTableExampleContext dc = new DataTableExampleContext())
        {
            var v = (from a in dc.Products.SqlQuery(querystring) select new { DT_RowId = a.id, name = a.name, number = a.number }).ToList();

            recordsTotal = v.Count();
            var data = v.Skip(skip).Take(pageSize).ToList();


            return Json(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = data }, JsonRequestBehavior.AllowGet);
        }
多亏了菲利普

        using (DataTableExampleContext dc = new DataTableExampleContext())
        {
            var v = (from a in dc.Products.SqlQuery(querystring) select GetResult(a, ColumnNames)).ToList();

            recordsTotal = v.Count();
            var data = v.Skip(skip).Take(pageSize).ToList();

            return Json(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = data }, JsonRequestBehavior.AllowGet);
        }
    }

    public Dictionary<string,object> GetResult(Product p, List<string> columnNames)
    {
        var properties = TypeDescriptor.GetProperties(typeof(Product));
        var dict = new Dictionary<string, object>();

        foreach (var x in columnNames)
        {
            if (x == "id")
            {
                dict["DT_RowId"] = properties[x].GetValue(p);
            }
            else
            {
                dict[x] = properties[x].GetValue(p);
            }

        }
        return dict;
    }
使用(DataTableExampleContext dc=new DataTableExampleContext())
{
var v=(从dc.Products.SqlQuery(querystring)中的a选择GetResult(a,ColumnNames)).ToList();
recordsTotal=v.Count();
var data=v.Skip(Skip).Take(pageSize.ToList();
返回Json(新的{draw=draw,recordsFiltered=recordsTotal,recordsTotal=recordsTotal,data=data},JsonRequestBehavior.AllowGet);
}
}
公共字典GetResult(产品p,列表列名称)
{
var properties=TypeDescriptor.GetProperties(typeof(Product));
var dict=新字典();
foreach(列名称中的变量x)
{
如果(x==“id”)
{
dict[“DT_RowId”]=properties[x].GetValue(p);
}
其他的
{
dict[x]=属性[x].GetValue(p);
}
}
返回命令;
}

如果您使用的是JSON.NET,字典应该序列化,将键的值作为属性名,并将与键关联的值作为属性值

如果您使用的是DataContractJsonSerializer,则需要将设置
UseSimpleDictionaryFormat
设置为true


然后,您将使用属性的名称作为键,值作为值来构建字典。如果用户选择需要名称,您将执行类似于
outputDict.Add(nameof(x.name),x.name)的操作;
然后返回要由序列化库序列化的字典。

如果使用的是JSON.NET,字典应该序列化,键的值作为属性名,与键关联的值作为属性值

如果您使用的是DataContractJsonSerializer,则需要将设置
UseSimpleDictionaryFormat
设置为true


然后,您将使用属性的名称作为键,值作为值来构建字典。如果用户选择需要名称,您将执行类似于
outputDict.Add(nameof(x.name),x.name)的操作;
然后返回要由序列化库序列化的字典。

1/要从属性名称中获取属性值,可以使用属性描述符:

var properties = TypeDescriptor.GetProperties(typeof(Product));
var value = properties[name].GetValue(product);
2/要生成答案,您可以创建
动态
对象:

dynamic result = new ExpandoObject();
var dict = (IDictionary<string,object>)result;
dict[name] = value;
dynamic result=new expandooobject();
var dict=(IDictionary)结果;
dict[name]=值;

然后可以将
结果
转换为JSON。

1/要从属性名称中获取属性值,可以使用属性描述符:

var properties = TypeDescriptor.GetProperties(typeof(Product));
var value = properties[name].GetValue(product);
2/要生成答案,您可以创建
动态
对象:

dynamic result = new ExpandoObject();
var dict = (IDictionary<string,object>)result;
dict[name] = value;
dynamic result=new expandooobject();
var dict=(IDictionary)结果;
dict[name]=值;

然后可以将
结果
转换为JSON。

您使用的JSON序列化程序是什么?请参阅上面的编辑中的完整控制器代码。我正在将JSON从控制器返回到JQuery DataTables。但是,作为数据传回的是我在查询语句中选择的内容。这就是我希望动态定义的内容,这样我就不必重新定义打开DBSet产品中的所有列。您使用的是什么JSON序列化程序?请参阅上面编辑中的完整控制器代码。我正在将JSON从控制器返回到JQuery DataTables。但是,作为数据传递回来的是我在查询语句中选择的内容。这是我希望动态定义的内容,因此我不必返回e DBSet Products。在我的示例中,如何从上面将值设置为“a.name”或“a.number”?我想重新创建这行“select new{DT_RowId=a.id,name=a.name,number=a.number}”
dict[“DT_RowId”]=properties[“id”]。GetValue(a)
等,在构建了
属性之后
dict
结果之后具有与示例相同的属性(但在动态对象中,而不是在静态对象中).Hi Philippe,谢谢您的帮助,但我不知道我是否看到了它。如何在Using语句var v=(来自dc.Products.SqlQuery(querystring)select result)中使用结果ExpandoObject?(来自dc.Products.SqlQuery(querystring)select GetResult(a,columnNames).Build method
dynamic GetResult(Product p,IEnumerable columnNames)
在我的示例中,如何从上面将值设置为“a.name”或“a.number”?我想重新创建这一行“select new{DT_RowId=a.id,name=a.name,number=a.number}”
dict[“DT_RowId”]=properties[“id”].GetValue(a)
等等,在构建了
属性之后,和
dict
结果之后,则具有与示例相同的属性(b