C# 使用linq表达式从多个表创建分层JSON结果
我已经看到了一些关于如何处理PHP和JSON的回应,但是使用linq对我正在尝试做的事情来说是一个障碍 高级:我有两个视图,BatchList和BatchDetails。BatchList是数据库中所有批次的视图,而BatchDetails是给定批次中所有订单的列表 我正在尝试构建具有以下层次结构的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
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。谢谢,这工作得很好。我最终建立了一个模型,以适应上面的结构,它的工作。