ASP.NET Web API 2 - 从 POST 方法解析 JSON 以动态查询数据库
ASP.NET Web API 2 - Parsing JSON from a POST method to query database dynamically
我想公开我的数据库,以便可以对我的控制器进行 POST,然后用于构建查询。我正在使用 entity framework 来构建我的数据上下文。这里的想法是客户端将在 POST 主体中传递 JSON。从那里将使用 JSON 中指定的属性和值构建查询。关键在于我不想对值进行硬编码。我希望以这种动态方式构建查询,以便对数据上下文所做的任何更改都将直接反映在代码中。
例如我想:
[
{
"NAME":"Random Name"
},
{
"NAME":"Random Name 2",
"STATUS":"ACTIVE"
}
]
翻译成如下内容:
var query = FROM d in DataContext
WHERE (x.NAME == "Random NAME 1")
OR (X.NAME == "Random Name 2" AND X.STATUS == "ACTIVE")
请记住,有 60 多种可能的属性可供选择,并且数据模型可能会发生变化。
我的想法是将JSON解析成对象数组,循环遍历每个对象,然后循环遍历该对象的非空属性以动态构建查询。
这是我的带有实际变量的代码。
控制器
public class AgreementsController : ApiController
{
private AgreementRepository agreementRepository;
public AgreementsController()
{
this.agreementRepository = new AgreementRepository();
}
public AGREEMENT[] Post([FromBody]AGREEMENT[] Agreements)
{
return agreementRepository.PostAgreements(Agreements);
}
}
服务
public class AgreementRepository
{
private DataBaseEntities db = new DataBaseEntities();
public AGREEMENT[] PostAgreements(AGREEMENT[] Agreements)
{
List<AGREEMENT> a = new List<AGREEMENT>();
foreach (AGREEMENT agreement in Agreements)
{
/////Loop Through Possible Attributes and then
/////Build queries based off of non null values.
////Append to List and return Agreement[] to controller
}
var agmts = a.ToArray<AGREEMENT>();
return agmts;
}
}
这可能是您想要使用 OData 的目的。看来您使用的是 EF,我相信它支持 OData。
这不是 JSON,但我认为这只是达到目的的一种手段,而不是严格的要求。它支持 $filter
选项,我认为这正是您要找的。
我想公开我的数据库,以便可以对我的控制器进行 POST,然后用于构建查询。我正在使用 entity framework 来构建我的数据上下文。这里的想法是客户端将在 POST 主体中传递 JSON。从那里将使用 JSON 中指定的属性和值构建查询。关键在于我不想对值进行硬编码。我希望以这种动态方式构建查询,以便对数据上下文所做的任何更改都将直接反映在代码中。
例如我想:
[
{
"NAME":"Random Name"
},
{
"NAME":"Random Name 2",
"STATUS":"ACTIVE"
}
]
翻译成如下内容:
var query = FROM d in DataContext
WHERE (x.NAME == "Random NAME 1")
OR (X.NAME == "Random Name 2" AND X.STATUS == "ACTIVE")
请记住,有 60 多种可能的属性可供选择,并且数据模型可能会发生变化。
我的想法是将JSON解析成对象数组,循环遍历每个对象,然后循环遍历该对象的非空属性以动态构建查询。
这是我的带有实际变量的代码。
控制器
public class AgreementsController : ApiController
{
private AgreementRepository agreementRepository;
public AgreementsController()
{
this.agreementRepository = new AgreementRepository();
}
public AGREEMENT[] Post([FromBody]AGREEMENT[] Agreements)
{
return agreementRepository.PostAgreements(Agreements);
}
}
服务
public class AgreementRepository
{
private DataBaseEntities db = new DataBaseEntities();
public AGREEMENT[] PostAgreements(AGREEMENT[] Agreements)
{
List<AGREEMENT> a = new List<AGREEMENT>();
foreach (AGREEMENT agreement in Agreements)
{
/////Loop Through Possible Attributes and then
/////Build queries based off of non null values.
////Append to List and return Agreement[] to controller
}
var agmts = a.ToArray<AGREEMENT>();
return agmts;
}
}
这可能是您想要使用 OData 的目的。看来您使用的是 EF,我相信它支持 OData。
这不是 JSON,但我认为这只是达到目的的一种手段,而不是严格的要求。它支持 $filter
选项,我认为这正是您要找的。