C# Web API 2:OData 4:带有公共存储库的单个控制器在传递到OK方法时不适用于IQueryable
我的EDMX文件中有大量的实体(通过Database first designer创建)。我不想为我要向Odata服务公开的每个实体创建单独的WebAPI2控制器。这就是为什么我的任务是创建一个Web Api 2 OData 4控制器,以返回属于EntityFramework EDMX文件的任何实体的数据 我创建了一个GetData(db,“entity name”)方法,动态地从存储库中返回任何实体的IQueryable 我的IQueryableC# Web API 2:OData 4:带有公共存储库的单个控制器在传递到OK方法时不适用于IQueryable,c#,entity-framework,asp.net-web-api,odata,C#,Entity Framework,Asp.net Web Api,Odata,我的EDMX文件中有大量的实体(通过Database first designer创建)。我不想为我要向Odata服务公开的每个实体创建单独的WebAPI2控制器。这就是为什么我的任务是创建一个Web Api 2 OData 4控制器,以返回属于EntityFramework EDMX文件的任何实体的数据 我创建了一个GetData(db,“entity name”)方法,动态地从存储库中返回任何实体的IQueryable 我的IQueryableGet()方法可以工作,但IQueryable
通用控制器代码
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.ModelBinding;
using System.Web.OData;
using System.Web.OData.Extensions;
using System.Web.OData.Query;
using System.Web.OData.Routing;
using Microsoft.OData.Edm;
using Microsoft.OData.Edm.Library;
using MyDataAccess;
using System.Reflection;
namespace DataService.Controllers
{
public class GenericController : ODataController
{
private Entities db = new MyDataAccess.Entities();
//HARD-CODING ENTITY NAME RETURNS RESULT,
//(but it is not acceptable solution)
//[EnableQuery(PageSize = 10)]
//public IQueryable<DimUser> Get()
//{
// return db.DimUsers;
//}
//THIS ONE DOES NOT WORK
[EnableQuery(PageSize = 10)]
public IQueryable Get()
{
var data = GetData(db,"DimUsers");
return data;
}
// Define other methods and classes here
public IQueryable GetData(MyDataAccess.Entities db, string EntityName)
{
foreach (PropertyInfo property in db.GetType().GetProperties())
{
var name = property.Name;
if (name == EntityName)
{
var v = property.GetValue(db);
return (IQueryable)v;
}
}
return null;
}
}
}
使用系统;
使用System.Collections.Generic;
使用系统数据;
使用System.Linq;
Net系统;
使用System.Net.Http;
使用System.Web.ModelBinding;
使用System.Web.OData;
使用System.Web.OData.Extensions;
使用System.Web.OData.Query;
使用System.Web.OData.Routing;
使用Microsoft.OData.Edm;
使用Microsoft.OData.Edm.Library;
使用MyDataAccess;
运用系统反思;
命名空间DataService.Controllers
{
公共类GenericController:ODataController
{
private Entities db=new MyDataAccess.Entities();
//硬编码实体名称返回结果,
//(但这不是可接受的解决方案)
//[启用查询(页面大小=10)]
//公共IQueryable Get()
//{
//返回db.DimUsers;
//}
//这个不行
[启用查询(页面大小=10)]
公共IQueryable Get()
{
var数据=GetData(db,“DimUsers”);
返回数据;
}
//在此处定义其他方法和类
公共IQueryable GetData(MyDataAccess.Entities数据库,字符串EntityName)
{
foreach(db.GetType().GetProperties()中的PropertyInfo属性)
{
var name=property.name;
if(name==EntityName)
{
var v=property.GetValue(db);
返回(IQueryable)v;
}
}
返回null;
}
}
}
注册方法
public static void Register(HttpConfiguration config)
{
IList<IODataRoutingConvention> routingConventions = ODataRoutingConventions.CreateDefault();
routingConventions.Insert(0, new CustomControllerRoutingConvention());
config.MapODataServiceRoute("EntityDataRoute", "GetEntityData", GenerateEdmModel_Entities(),
new DefaultODataPathHandler(), routingConventions);
}
公共静态无效寄存器(HttpConfiguration配置)
{
IList routingConventions=ODataRoutingConventions.CreateDefault();
routingConventions.Insert(0,新CustomControllerRoutingConvention());
config.MapODataServiceRoute(“EntityDataRoute”、“GetEntityData”、GeneratedMModel_Entities(),
新的DefaultODataPathHandler(),路由约定);
}
CustomControllerRoutingConvention类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web;
using System.Web.OData.Routing;
using System.Web.OData.Routing.Conventions;
namespace DataService
{
public class CustomControllerRoutingConvention : IODataRoutingConvention
{
public string SelectAction(ODataPath odataPath, System.Web.Http.Controllers.HttpControllerContext controllerContext, ILookup<string, System.Web.Http.Controllers.HttpActionDescriptor> actionMap)
{
return null;
}
public string SelectController(ODataPath odataPath, HttpRequestMessage request)
{
return "Generic";
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Net.Http;
使用System.Web;
使用System.Web.OData.Routing;
使用System.Web.OData.Routing.Conventions;
命名空间数据服务
{
公共类CustomControllerRoutingConvention:IODataRoutingConvention
{
公共字符串SelectAction(ODataPath ODataPath,System.Web.Http.Controllers.HttpControllerContext controllerContext,ILookup actionMap)
{
返回null;
}
公共字符串SelectController(ODataPath ODataPath、HttpRequestMessage请求)
{
返回“通用”;
}
}
}
解决方案是创建具有特定结果类型的结果实例。见下文
[EnableQuery(PageSize = 10)]
public IQueryable Get()
{
var data = GetData(db,"DimUsers");
return Okay(data, data.GetType());
}
protected IHttpActionResult Okay(object content, Type type)
{
var resultType = typeof(OkNegotiatedContentResult<>).MakeGenericType(type);
return Activator.CreateInstance(resultType, content, this) as IHttpActionResult;
}
[启用查询(页面大小=10)]
公共IQueryable Get()
{
var数据=GetData(db,“DimUsers”);
返回OK(data,data.GetType());
}
受保护的IHttpActionResult正常(对象内容,类型)
{
var resultType=typeof(OkNegotiatedContentResult)。MakeGenericType(type);
将Activator.CreateInstance(resultType,content,this)作为IHttpActionResult返回;
}