【问题标题】:How to return nested, one to many relationship in a ASP.NET MVC json response?如何在 ASP.NET MVC json 响应中返回嵌套的一对多关系?
【发布时间】:2009-09-23 04:17:05
【问题描述】:

如何格式化 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 以返回可以解析为 data[i].price[1].qty、data[i].price[1].pricePer 的 Json? (或者只是在初始化器中添加一个多部分对象?)

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

【问题讨论】:

  • 顺便说一句,我正在使用关系来填充 html
  • 除非我错过了这个问题......我不知道如何在不知道表结构的情况下回答这个问题。你有一个单独的表,其中包含项目 - 数量 - 价格值?
  • Product 表具有一对多到 Price(s) 表,其中包含“qty”和“pricePer”字段。因此,该对象将具有 product.prices.qty 和 product.prices.pricePer,其中价格是关系。
  • 想一想,这是 LinqPad 做得好的地方。
  • 类似 from p in Products where p.ItemNo == "CHOAK21" select new { first = new {a = "hello", b = "there" }, second = new {a = "嗨", b = "第 2 号"} }

标签: jquery asp.net-mvc linq-to-sql autocomplete


【解决方案1】:

您需要您的投影对象包含一个属性“价格”,因此当它被序列化为 json 时,您可以像引用的那样做:

数据[i].price[1].qty

将您的 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 }; 
}

.. 我没有检查上面的语法,但希望你能明白。这样你的匿名对象应该有一个属性idname(和以前一样)和一个名为price 的集合。您甚至可以像这样进一步投影您想要的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 }}; 
}

.. 但我认为这没有必要,因为名称相同。请原谅我的错误格式。

【讨论】:

  • 太棒了!我刚刚从另一篇文章中了解到如何创建 Repository 类并将它们用作 Linq to SQL 响应上的 cookie 切割器,以在 DDD 中获得你想要的 Poco 对象。将此与您的技术结合起来,我就有了一种很好的方法来为我的 MVC 视图创建模型,并将这些公开给 JQuery 的 JSON。真的很酷!
  • 它也会变得更好——如果你采用 TDD 方法,我有一个很好的方法来将测试 json 格式的数据解析为 POCO 对象链:stackoverflow.com/questions/1584074/…(我在一个项目中使用它) - 工作一种享受)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
相关资源
最近更新 更多