我正在实现web api方法来返回一些数据。它工作正常,直到我们想要引入新参数来确定我们是否应该返回产品的额外细节或仅返回正常细节。
我的原始代码如下:
using (IDbConnection conn = _context.Database.GetDbConnection())
{
var parameters = new
{
CourseName = model.query,
CourseType = model.CourseType,
other parameters....
};
var obj = await conn.QueryAsync<Offering> ("SearchOfferings", parameters, commandType: CommandType.StoredProcedure);
if (obj == null)
return NotFound("Record not found");
return new ObjectResult(obj);
}
我正在使用DAPPER来执行存储过程。
现在,我们已经从querystring
添加了额外参数,并将逻辑添加到现有代码中。如果Extra = True,我们希望返回具有不同对象类型的FullDetail
。否则,只返回简要数据。
我想知道如何在objectToReturn
(动态参数)方法中传递QueryAsync
值?
string objectToReturn = string.Empty;
if (extra)
objectToReturn = "Offering";
else
objectToReturn= "BriefOffering";
var obj = await conn.QueryAsync<**objectToReturn**> ("SearchOfferings", parameters, commandType: CommandType.StoredProcedure);
答案 0 :(得分:3)
当客户端可以更改查询参数以获得详细的产品时,它也可能只是访问不同的资源,而是公开您的详细产品。
假设您提供的产品的当前REST API资源是:
set
为什么没有第二个像:
http:\server.com\offerings\{id}
这使您的REST界面更易于使用和理解,同时还简化了实施。
如果你真的想坚持查询参数开关,那么你可以只对两种通用类型的方法之一进行条件调用:
http:\server.com\detailedOfferings\{id}`
答案 1 :(得分:1)
Dapper确实有可能对你有帮助的备用Query / QueryAsync方法签名 - 有一个会返回一组对象,其中每个对象都是通过方法参数而不是泛型类型参数指定的类型。
这可以让你做这样的事情:
var typeToReturn = Type.GetType("MyProject.Entities.Offering");
var obj = await conn.QueryAsync(
type: typeToReturn,
sql: "SearchOfferings",
param: parameters,
commandType: CommandType.StoredProcedure
);
类型名称必须是所需类型的全名,因此如果QueryString值仅指定&#34;提供&#34;然后你必须知道该实体将在哪个命名空间并将代码更改为
var nameOfType = "Offering";
const string entityNamespace = "MyProject.Entities";
var typeToReturn = Type.GetType(entityNamespace + "." + nameOfType);
var obj = await conn.QueryAsync(
type: typeToReturn,
sql: "SearchOfferings",
param: parameters,
commandType: CommandType.StoredProcedure
);
当然,返回类型为IEnumerable&lt; object&gt;意味着你不能轻易地直接对返回的数据做很多事情,但如果你想写一些代码来返回动态类型的代码,情况总是如此;你不会在编译时知道将要回来的类型。例如,如果您要将其序列化为JSON,那么这没什么大不了的。
我只是想添加这个答案,因为它直接解决了你的问题 - 但我也同意Sam C的评论,你可能会更好地使用返回IEnumerable&lt; dynamic&gt;的方法签名。如果你真的不关心返回什么类型。