.net - Dbcontext 属性中的动态类型
问题描述
我有一个存储过程来从复杂的查询结果中获取数据。因此,为了从该过程中获取数据,我在 Dbcontext 中添加了一个属性及其结果类型。
internal DbQuery<Dashboard> Dashboard { get; set; }
在这里,我自己定义了Dashboard
模型。
当过程的结果列是静态的时,它工作正常,但问题是有时来自过程的结果集可能具有动态列。所以我也需要相应地改变我的Dashboard
模型。如何通过在声明我的 Dbcontext 属性时添加动态类型来管理它?
我刚刚用另一种方式尝试过
目前我有一组静态数据
IQueryable<DynamicDashboard> fullJoinedResult = context.DynamicDashboard.FromSql("dbo.DynamicDashboard").DefaultIfEmpty().AsQueryable();
现在对于我需要的每个动态字段,我正在将我当前的静态数据与动态表数据进行左连接
我已将我的动态字段存储在此列表中
var selectedDynamicFields = new List<DashboardFields>();
var proposalDynamicDatas = context.ProposalDynamicData.Where(w => selectedDynamicFields.Select(s => s.FormFieldId).Contains(w.FormFieldId)).ToList();
foreach (var field in selectedDynamicFields)
{
var qry = resultSet.GroupJoin(proposalDynamicDatas.Where(w=>w.FormFieldId=field.FieldId).AsEnumerable(),
"ProposalId", "ProposalId", "new(outer.ProposalId as Foo,inner.ProposalId as
Bars)");
};
我可以在这个 for 循环中动态更改我的结果集吗?当前我在 GroupJoin 中遇到错误,它在 IEnumerable 中说 No 'ProposalId'。查不出来
解决方案
老实说,我不会将 EF 用于该特定要求。EF 是将关系数据映射到对象模型并返回的 ORM。虽然它可以与存储过程交互,但这不是它的亮点,也不是你应该如何尝试和标准化数据层以尝试和适应 100% 的情况。
建造房屋时,您需要将木头连接在一起,常见的选择是钉子和螺钉。每个都有优点和缺点,其中 EF 可能被认为是一个很好的离合电钻,用于将框架拧在一起。这并不排除房子里的所有东西都应该拧在一起。有些工作可能需要钉子或螺母和螺栓。为手头的工作使用最好的工具,而不是试图弄清楚如何将所有东西拧在一起。(为了一致性而保持一致性是我书中的代码/设计气味。)
根据您的描述,您希望存储数据的动态视图以显示为仪表板。ORM 模型可以处理用于查看/编辑相关对象的特定视图,但要为仪表板获取数据的动态合并,这更像是一种报告考虑,其中一种不同的技术适合填充这样的读取- 只有模型。如果您有一个能够返回混杂数据的存储过程,那么请考虑使用普通 ADO 调用来返回一个可迭代的结构来填充您的视图,包括您可能需要稍后使用 EF 检索和填充相应的整个对象的 ID . 只要解决方案易于理解并且自力更生/包含,它就能比试图迫使方形钉穿过圆孔更好地完成工作。
编辑:如果您有一个现有的带有值的静态仪表板对象,并且想要将其更改为适合添加/交换来自各种相关表的动态值集的东西:那么一个选项是返回一个关系结构,其中返回动态值就像一个名称-值对。(即SourceTable、SourceColumn、SourceRowId、SourceType、Value)
让动态 Sproc/View 返回一个 Dashboard 实体,该实体包含具有上述值的子元素,您的业务逻辑可以检查这些值以帮助显示和链接回各自的表。SourceTable 和 SourceRowId 将允许业务逻辑确定值来自哪个实体和行。SourceColumn 将为您提供值的显示名称或已知常量以查找合适的显示名称。SourceType 将有助于可能的客户端显示选项,因为值可能需要以string
. 因此,例如,返回的 DateTime 可能始终以 ISO 格式(yyyy-MM-ddThh:mm:ssZ)返回,然后 UI/BL 可以根据用户的区域/偏好对其进行格式化。同样可用于识别货币值以显示适当的符号等。
通过这种方式,EF 仍然可以在只读容量中正常运行,以检索 Dashboard 和相关 DashboardValues 集合的此结构。
推荐阅读
- google-cloud-sql - pg_hba.conf 之类的访问控制
- c++ - QT Opengl总是黑屏
- angular - Angular 6 - 在不使用直接链接的路径下发布
- gremlin - 海王星与 Tinkerpop > 如何转义 $ 符号?
- .net - Angular 5:加载资源失败:服务器响应状态为 404
- c# - Automapper AutoMapper.AutoMapperMappingException:错误映射类型
- php - 角度和 PHP
- html - 使用 CSS 调整固定菜单和页面内容
- laravel - 在 Laravel 中存储多个数据
- pyspark - 获取 Spark DataFrame 中两个日期之间的所有日期