Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web API 2:OData 4:带有公共存储库的单个控制器在传递到OK方法时不适用于IQueryable_C#_Entity Framework_Asp.net Web Api_Odata - Fatal编程技术网

C# Web API 2:OData 4:带有公共存储库的单个控制器在传递到OK方法时不适用于IQueryable

C# 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

我的EDMX文件中有大量的实体(通过Database first designer创建)。我不想为我要向Odata服务公开的每个实体创建单独的WebAPI2控制器。这就是为什么我的任务是创建一个Web Api 2 OData 4控制器,以返回属于EntityFramework EDMX文件的任何实体的数据

我创建了一个GetData(db,“entity name”)方法,动态地从存储库中返回任何实体的IQueryable

我的IQueryableGet()方法可以工作,但IQueryable Get()(没有硬编码的DimUser)不能工作。OK方法不执行任何操作,并返回空白结果

我很沮丧,因为我没有得到任何错误,而且我似乎没有弄清楚Ok方法的内部工作原理

问题: 在我的GenericController类中是否可以使用IQueryable Get()方法而不是IQueryable Get()


通用控制器代码

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返回;
}