首页 > 解决方案 > 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'。查不出来

标签: .netentity-frameworkasp.net-coreentity-framework-core

解决方案


老实说,我不会将 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 集合的此结构。


推荐阅读