【问题标题】:EF5 Mapping IQueryable to custom class with Column AttributesEF5 将 IQueryable 映射到具有列属性的自定义类
【发布时间】:2012-10-02 11:13:59
【问题描述】:

好的,问题来了,我在数据库中有一个视图,其中包含大量信息,100 列,vwComponantA

我的 .net 应用程序中有一个名为 ComponantA 的实体,它包含使用 [Column()] 属性的所有映射,这很好,可以工作,但速度很慢,因为它在 DB 上执行 select * 来填充对象,这又可以了。

为了解决上述性能问题,我引入了 DynamicLinq。这允许我减少我带回的列的数量,并且仍然允许我使用类型安全来使用普通的 Linq 进行查询,这很棒。然后处理我带回的缩减字段,我有单独的 POCO 组件,每个组件都有自己的一组 [Column] 属性,在运行时使用映射类进行映射。

问题在于,在处理大型数据集时,它们之间的映射可能会很慢,10000 条记录映射 10000 次等。EF 所做的是创建一个 DynamicProxyClass,然后您可以在组件之间进行映射。

我的问题是,我怎样才能避免映射并让 EF 为我做映射? (由于动态linq,我正在处理IQueryable而不是IQueryable<T>

必须有一种方法可以利用 [Column] 属性同时保持查询动态。

这是所有代码优先和实体框架 5。

感谢您的帮助。尼克

【问题讨论】:

    标签: entity-framework mapping iqueryable entity-framework-5


    【解决方案1】:

    说实话,我不明白你的问题,但你想要做的不需要动态 linq。你只需要预测:

    var data = from c in context.vwComponentA
               select new POCOWithIdAndName {
                   Id = c.Id,
                   Name = c.Name
               };
    

    投影在数据库中执行,因此它只会带回IdName

    【讨论】:

    • 我有这个的原因是因为在我为特定类型选择的列中存在某些规则。即视图上有 5 列都表示某些东西,但只有一个我想映射回对象上的通用属性。这有意义吗?
    • 我仍然不明白为什么它应该是投影的问题,您明确地说哪一列分配给了哪个属性。
    • 好的,所以我使用 DynamicSQL 的原因是,例如,我有一个包含 5 列的视图,它们都具有相似的含义,但取决于用户通过 UI 选择的内容,其中之一需要是映射回一个名为“Outcome”的属性,然后这个属性会驱动很多逻辑。所以它不像“Outcome = c.Outcome”那么简单,它更像“Outcome = c.”。我想问题是,我怎么能用你上面的建议来做到这一点? (我可能让你更困惑 - 让我在 zerobin 上扔一些东西)
    猜你喜欢
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 2018-04-21
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    相关资源
    最近更新 更多