构建一个动态匿名对象

本文关键字:动态 对象 一个 构建 | 更新日期: 2023-09-27 18:08:50

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

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

我如何动态地构建这个"select new {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返回的是非常不同的,它有键和值在它,这不是什么数据表所期望的。

谢谢!

完整控制器代码

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;
    }

构建一个动态匿名对象

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

var properties = TypeDescriptor.GetProperties(typeof(Product));
var value = properties[name].GetValue(product);
要构建答案,您可以创建一个dynamic对象:
dynamic result = new ExpandoObject();
var dict = (IDictionary<string,object>)result;
dict[name] = value;

可以将result转换为JSON

如果您使用JSON。. NET中,字典应该以Key的值作为属性名,并以与该键关联的值作为属性值进行序列化。

如果您正在使用DataContractJsonSerializer,您将希望提供设置UseSimpleDictionaryFormat为true。

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