【问题标题】:Dynamic type in Dbcontext propertyDbcontext 属性中的动态类型
【发布时间】:2020-06-16 13:20:49
【问题描述】:

我有一个从复杂查询结果中获取数据的存储过程。因此,为了从该过程中获取数据,我在 Dbcontext 中添加了一个属性及其结果类型。

 internal DbQuery<Dashboard> Dashboard { get; set; }

这里我自己定义了Dashboard 模型。

当过程的结果列是静态的时,它可以正常工作,但问题是有时来自过程的结果集可能具有动态列。所以我也需要相应地更改我的Dashboard 模型。 如何通过在声明 Dbcontext 属性时添加动态类型来管理此问题?

我刚刚用另一种方式尝试过

目前我有一组静态数据

IQueryable<DynamicDashboard> fullJoinedResult = context.DynamicDashboard.FromSql("dbo.DynamicDashboard").DefaultIfEmpty().AsQueryable();

现在对于我需要的每个动态字段,我将我当前的静态数据与动态表数据进行左连接

我已将我的动态字段存储在此列表中

var selectedDynamicFields = new List&lt;DashboardFields&gt;();


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'。查不出来

【问题讨论】:

    标签: .net entity-framework asp.net-core entity-framework-core


    【解决方案1】:

    老实说,我不会将 EF 用于该特定要求。 EF 是将关系数据映射到对象模型并返回的 ORM。虽然它可以与存储过程交互,但这不是它的亮点,也不是你应该如何尝试和标准化数据层以尝试和适应 100% 的情况。

    建造房屋时,您需要将木头固定在一起,常见的选择是钉子和螺钉。每种都有优点和缺点,其中 EF 可能被认为是一个很好的离合电钻,用于将框架拧在一起。这并不排除房子里的所有东西都应该拧在一起。有些工作可能需要钉子或螺母和螺栓。为手头的工作使用最好的工具,而不是试图弄清楚如何将所有东西拧在一起。 (为了一致性而保持一致性是我书中的代码/设计气味。)

    根据您的描述,您希望存储数据的动态视图以显示为仪表板。 ORM 模型可以处理用于查看/编辑相关对象的特定视图,但要为仪表板获取数据的动态合并,这更像是一种报告考虑,其中一种不同的技术适合填充这样的读取- 只有模型。如果您有一个能够返回混杂数据的存储过程,那么请考虑使用普通 ADO 调用来返回一个可迭代的结构来填充您的视图,包括您可能需要稍后使用 EF 检索和填充相应的整个对象的 ID .只要解决方案易于理解且自力更生/包含,它就能比试图迫使方形钉穿过圆孔更好地完成工作。

    编辑:如果您有一个现有的带有值的静态 Dashboard 对象,并且想要将其更改为可以添加/交换来自各种相关表的动态值集的东西:那么一个选择是返回一个关系结构,其中动态值以类似名称-值对的形式返回。 (即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 集合的此结构。

    【讨论】:

    • 程序中的数据到目前为止是静态的,我可以使用仪表板模型并使用 linq 执行我的业务逻辑。但是现在数据正在根据要求变为动态,如果我将其更改为 ado.net,我可以重用以前的代码,它使用 linq 来执行我的业务逻辑吗?
    • 如果不完全了解当前的代码/结构和新要求,就无法回答。我在上面编辑了我的答案,以包含另一个选项,以便为动态值使用名称/值对结构之类的东西。
    • 你能看看我的新实现吗?问题已更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2016-02-15
    相关资源
    最近更新 更多