加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 从类型获取DbSet

发布时间:2020-12-15 07:49:19 所属栏目:百科 来源:网络整理
导读:我正在尝试为MVC 6应用程序制作一个通用的表查看器/编辑器. 我目前使用 Context.GetEntityTypes(); 给我一张表的清单. 现在我需要获取特定类型的数据.我目前的实施是: // On my contextpublic IQueryabledynamic GetDbSetByType(string fullname){ Type tar
我正在尝试为MVC 6应用程序制作一个通用的表查看器/编辑器.

我目前使用

Context.GetEntityTypes();

给我一张表的清单.

现在我需要获取特定类型的数据.我目前的实施是:

// On my context
public IQueryable<dynamic> GetDbSetByType(string fullname)
{
    Type targetType = Type.GetType(fullname);

    var model = GetType()
        .GetRuntimeProperties()
        .Where(o =>
            o.PropertyType.IsGenericType &&
            o.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>) &&
            o.PropertyType.GenericTypeArguments.Contains(targetType))
        .FirstOrDefault();

    if (null != model)
    {
        return (IQueryable<dynamic>)model.GetValue(this);
    }

    return null;
}

在我的控制器中使用此代码

[HttpGet("{requestedContext}/{requestedTable}/data")]
public IActionResult GetTableData(string requestedContext,string requestedTable)
{
    var data = Request.Query;
    var context = GetContext(requestedContext);

    if (context == null)
    {
        return new ErrorObjectResult("Invalid context specified");
    }
    var entity = context.GetEntity(requestedTable);

    if (entity == null)
    {
        return new ErrorObjectResult("Invalid table specified");
    }

    var set = context.GetDbSetByType(entity.ClrType.AssemblyQualifiedName);

    if (set == null)
    {
        return new ErrorObjectResult("Invalid table specified - DbSet could not be found");
    }

    var start = Convert.ToInt32(data["start"].ToString());
    var count = Convert.ToInt32(data["length"].ToString());
    var search = data["search[value]"];

    return new ObjectResult(set.Skip(start).Take(count));
}

就这样,这将返回长度数据和位置开始的数据.但是,我无法对IQueryable< dynamic>的特定属性执行查询.

问题是:

>这似乎是一件小事,所以我几乎肯定我错过了一些东西 – 这一定很容易做到.
>如果不是1,那么我如何将我的对象集转换回DbSet< T>所以我可以执行我的查询?如果我设置了一个断点和检查,我可以看到我所有的数据只是坐在那里.

注意:这是EF7

附加信息:

> requestedTable是完全限定类型EG:< mysystem> .Models.Shared.Users

编辑(2016/5/5)

我最终只是用简单的SQL来做这些 – 如果有人设法得到这个工作,请让我知道!

解决方法

这将通过使用通用方法和使用DbContext.Set< TEntity>()来简化.您可以在运行时创建一个通用的方法,如下所示:
public IActionResult GetTableData(string requestedContext,string requestedTable)
{
    var context = GetContext(requestedContext);

    if (context == null)
    {
        return new ErrorObjectResult("Invalid context specified");
    }
    var entity = context.GetEntity(requestedTable);

    if (entity == null)
    {
        return new ErrorObjectResult("Invalid table specified");
    }

    var boundMethod = s_getTableDataMethodInfo.MakeGenericMethod(entity.ClrType);
    return boundMethod.Invoke(this,new object[] { context }) as IActionResult;
}

private static readonly MethodInfo s_getTableDataMethodInfo
    = typeof(MyController).GetTypeInfo().GetDeclaredMethod("GetTableDataForEntity");

private IActionResult GetTableDataForEntity<TEntity>(DbContext context)
    where TEntity : class
{
    var data = Request.Query;
    var start = Convert.ToInt32(data["start"].ToString());
    var count = Convert.ToInt32(data["length"].ToString());
    var search = data["search[value]"];

    return new ObjectResult(context.Set<TEntity>().Skip(start).Take(count));
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读