当我在uri中传递$inlinecount=allpages
时,我正在尝试让OData返回数据库中的实体数量。我已经在Stack Overflow中读到我应该返回IQueryable
而不是IHttpActionResult
,但这并没有解决问题。我也尝试按照asp.net网站上的教程进行操作,但这也没有给出任何结果。
[EnableQuery(
PageSize = BuildingConstants.BuildingsPerPage,
MaxTop = BuildingConstants.MaxBuildingsPerPage,
AllowedArithmeticOperators = AllowedArithmeticOperators.None,
AllowedLogicalOperators = AllowedLogicalOperators.None,
AllowedFunctions = AllowedFunctions.SubstringOf,
AllowedQueryOptions = AllowedQueryOptions.Filter | AllowedQueryOptions.OrderBy | AllowedQueryOptions.Top | AllowedQueryOptions.Skip | AllowedQueryOptions.InlineCount)]
[ResponseType(typeof(IEnumerable<ListedBuildingResponseModel>))]
public IQueryable<ListedBuildingResponseModel> Get()
{
var buildings = this.buildings
.GetBuildings()
.ProjectTo<ListedBuildingResponseModel>();
return buildings;
}
这是我写的关于OData的一切。控制器继承ApiController
,而不是ODataController
。在Register
方法中,我没有添加任何OData路由或模型构建器。 $top
,$skip
,$orderby
以及其他所有工作正常,但$inlinecount=allpages
。有关如何解决问题的任何建议吗?
答案 0 :(得分:0)
我设法通过添加以下代码使count=true
工作:
public static void Register(HttpConfiguration config)
{
config.MapODataServiceRoute("odata", "odata", model: GetEdmModel());
}
private static IEdmModel GetEdmModel()
{
var builder = new ODataConventionModelBuilder();
builder.EntitySet<ListedBuildingResponseModel>("Buildings");
builder.EnableLowerCamelCase();
var edmModel = builder.GetEdmModel();
return edmModel;
}
现在一切正常,但我不能在课堂上使用我的其他动作,因为我得到406错误状态代码而且我不知道为什么。我不希望我的其他行动支持OData,所以我正在考虑可能的解决方案。仅为OData操作执行单独的控制器是一个选项,但我还有家庭,费用和债务控制器,其Get方法我想支持OData。这意味着,我需要创建另外4个控制器,只有1个Get方法。有没有办法可以使用返回不同类型的方法SearchController
,GetBuildings
,GetHouseholds
和GetExpenses
来创建单个GetDebts
?因为,据我了解这行代码
uilder.EntitySet<ListedBuildingResponseModel>("Buildings");
以某种方式&#34;绑定&#34; BuildingsController
到ListedBuildingResponseModel
。