使用linq表达式从多个表创建分层JSON结果

时间:2013-12-26 20:41:56

标签: c# json linq

我已经看到了一些关于SO处理PHP和JSON的回复,但是使用linq正在试图解决我想要做的事情。

高级:我有两个视图,BatchList和BatchDetails。 BatchList是我数据库中所有批次的视图,而BatchDetails包含给定批次中所有订单的列表。

我正在尝试使用以下层次结构构建JSON结构:

BatchList.BatchNumber 1 Parent
  BatchDetails.OrderNumber 1 Children bound by related BatchNumber 1
  BatchDetails.OrderNumber 2
  BatchDetails.OrderNumber 3
BatchList.BatchNumber 2 Parent
  BatchDetails.OrderNumber 1 Children bound by related BatchNumber 2
  BatchDetails.OrderNumber 2
  BatchDetails.OrderNumber 3

我知道一旦我构建了这个,我就可以对它进行JSON编码并将其传递给我的视图进行显示。我见过这样的例子:

{
    "d" : {
        "results": [
        {
            "CategoryID": 1, 
            "CategoryName": "Beverages", 
            "Description": "Soft drinks, coffees, teas, beers, and ales", 
            "Products": {
                "results": [
                {
                    "ProductID": 1,
                    "ProductName": "Chai", 
                    "QuantityPerUnit": "10 boxes x 20 bags"
                },
                // ...
                // Product 2
                // ...
                ]
            }
        },
        // ...
        // Category 2
        // ...
        ]
    }
}

目前我唯一拥有的linq表达式是:

public IQueryable<vwBatchList> AggregateBatchList(int coid)
{
    var contex = new LBPEntities();
    var batchList = 
        (from x in contex.vwBatchLists
        where x.CoId == coid
        select x);
    return batchList;
}

然后我可以对结果进行编码并传递给网格。

但我想将它与这个引用批号的表达式联系起来:

public IQueryable<vwBatchDetail> AggregateBatchDetails(string batchNumber)
{
    var contex = new LBPEntities();
    var batchDetails = 
        (from x in contex.vwBatchDetails
        where x.BatchNumber == batchNumber
        select x);
    return batchDetails;
}

但是从数据库中的两个相关表创建它正在逃避我。我还没有找到任何处理这个问题的好的JSON教程,所有的例子都有硬编码的层次结构。

2 个答案:

答案 0 :(得分:1)

你可以试试这个

public IQueryable<vwBatchList> AggregateBatchList(int coid)
{
     var contex = new LBPEntities();
     var batchList = contex.vwBatchLists.Where(x => x.CoId == coid).Select(x => new
                  {
                        CoId = x.CoId,
                        ...
                        BatchDetails = contex.vwBatchDetails.Where(d => d.BatchNumber == x.batchNumber)
                  });

     var result = Json(batchList);
}

答案 1 :(得分:0)

我不是这方面的专家,但我相信你需要在你的linq声明中加入。见 - http://code.msdn.microsoft.com/LINQ-Join-Operators-dabef4e9

类似的东西:

 var batchList = (from x in contex.vwBatchLists
                  join d in contex.vwBatchDetails on x equals d.CoId
                  where x.BatchNumber == batchNumber
                  select x);

这是我在没有看到数据库架构的情况下能做的最好的事情: - )