代码之家  ›  专栏  ›  技术社区  ›  Zachary Scott

如何在ASP.NET MVC JSON响应中返回嵌套的一对多关系?

  •  0
  • Zachary Scott  · 技术社区  · 15 年前

    如何将JSON响应格式化为包含嵌套的一对多相关数据?

    我的简单jquery自动完成示例。linq2sql在里面。这个问题的第一部分回答了 here . 这将使用带有LINQ 2 SQL的存储库来发送响应:

    public IQueryable GetProductIDs(string myPrefix, int limit)
    {
        return from z in db.Products
               where z.ItemNo.StartsWith(myPrefix)
               select new { id = z.ItemNo, name = z.DetailText, **** }; 
               //, This is where I need to assemble about 4 related product quantities
               //  like Qty1: 5, PricePer: $3, Qty2: 10, PricePer: $2, Qty3: 25, PricePer: $1
    }
    

    它返回一个JSON对象:

    public ActionResult autocomplete(string q, int limit)
    {
        var jsonData = plantRepository.GetProductIDs(q, limit);
        return Json(jsonData);
    }
    

    这将返回可通过javascript解析的数据:

    parse: function(data) {
        var rows = new Array();
        for( var i = 0; i<data.length; i++)
        {   rows[i] = {data:data[i], value:data[i].name, result:data[i].id }; }
        return rows;}
    

    那么如何格式化linq 2 sql以返回可以像数据[i].price[1].qty,数据[i].price[1].priceper那样分析的json?(或者只是在初始值设定项中添加一个多部分对象?)

    我希望这是有道理的。我提供了所有的信息来提供一个背景,因为这个问题本身对我来说没有意义。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Matt Kocaj    15 年前

    您需要您的投影对象包含一个属性“price”,所以当它被序列化为JSON时,您可以像引用的那样:

    数据[I].价格[1].数量

    将LINQ查询更改为如下所示:

    public IQueryable GetProductIDs(string myPrefix, int limit)
    {
        return from prod in db.Products
               where prod.ItemNo.StartsWith(myPrefix)
               select new { id = prod.ItemNo, name = prod.DetailText, price = from pce in db.Price where pce.ItemNo equals prod.ItemNo select pce }; 
    }
    

    …我没有检查上面的语法,但希望你能理解。这样,您的anon对象应该有一个属性 id name (和以前一样)和一个集合 price . 你甚至可以进一步投射 价格 你想要这样:

    public IQueryable GetProductIDs(string myPrefix, int limit)
    {
        return from prod in db.Products
               where prod.ItemNo.StartsWith(myPrefix)
               select new { id = prod.ItemNo, name = prod.DetailText, price = from pce in db.Price where pce.ItemNo equals prod.ItemNo select new { qty = pce.qty, pricePer = pce.pricePer }}; 
    }
    

    …但我不认为这是必要的,因为名字是一样的。请原谅我的格式错误。