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>的特定属性执行查询. 问题是: >这似乎是一件小事,所以我几乎肯定我错过了一些东西 – 这一定很容易做到. 注意:这是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)); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ruby – Middleman Server在Windows上不可用0.0.0.0:4567
- Cocos2D创建多彩文本显示标签
- c – 将int的向量转换为str的向量
- PostgreSQL分区表(Table Partitioning)应用
- Identifying multiple/single values of metadata and reco
- XStream 去除生成的XML节点的class="XXX"
- 使用正则表达式实现一个简单的QQ登录验证
- XSLT文档中的模板以什么顺序执行,它们是否匹配源XML或缓冲输
- React Redux使用的一些小优化
- Flex+Red5实现在线视频播放