Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq表达式从多个表创建分层JSON结果_C#_Json_Linq - Fatal编程技术网

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

C# 使用linq表达式从多个表创建分层JSON结果,c#,json,linq,C#,Json,Linq,我已经看到了一些关于如何处理PHP和JSON的回应,但是使用linq对我正在尝试做的事情来说是一个障碍 高级:我有两个视图,BatchList和BatchDetails。BatchList是数据库中所有批次的视图,而BatchDetails是给定批次中所有订单的列表 我正在尝试构建具有以下层次结构的JSON结构: BatchList.BatchNumber 1 Parent BatchDetails.OrderNumber 1 Children bound by related BatchN

我已经看到了一些关于如何处理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;
}
publicIQueryable聚合目录列表(int-coid)
{
var contex=新的lbpenties();
var批处理列表=
(从contex.vwBatchList中的x开始)
其中x.CoId==CoId
选择x);
返回批处理列表;
}
然后我可以对结果进行编码并传递到网格

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

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;
}
public IQueryable AggregateBatchDetails(字符串batchNumber)
{
var contex=新的lbpenties();
var batchDetails=
(从contex.vwBatchDetails中的x开始)
其中x.BatchNumber==BatchNumber
选择x);
返回详细信息;
}

但是,从数据库中的两个相关表创建它让我不知所措。我还没有找到任何解决这个问题的可靠JSON教程,所有示例通常都有硬编码的层次结构。

我不是这方面的专家,但我相信您需要在linq语句中加入JOIN。见-

比如:

 var batchList = (from x in contex.vwBatchLists
                  join d in contex.vwBatchDetails on x equals d.CoId
                  where x.BatchNumber == batchNumber
                  select x);
这是我在没有看到数据库模式的情况下所能做的最好的了:-)

您可以试试这个

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);
}
publicIQueryable聚合目录列表(int-coid)
{
var contex=新的lbpenties();
var batchList=contex.vwBatchList.Where(x=>x.CoId==CoId)。选择(x=>new
{
CoId=x.CoId,
...
BatchDetails=contex.vwBatchDetails.Where(d=>d.BatchNumber==x.BatchNumber)
});
var result=Json(批处理列表);
}

不幸的是,这并没有达到我想要的数据结构,简单连接在本例中不起作用。这是一个创建平面返回结构的简单连接,不是层次结构列表。
BatchDetails=x.Details
应该实现什么?如果您的BatchList中有一个BatchDetails集合,您可以通过
BatchDetails=x.Details
引用此集合。。否则,根据我更新的答案,您可以使用
Where()
。啊,BatchList和Batch Details只是我数据库中的表,我使用的是实体框架,所以我没有任何模型包含一组BatchList数据和一组BatchDetails。谢谢,这工作得很好。我最终建立了一个模型,以适应上面的结构,它的工作。