2012-10-02 23 views
1

好了,所以这里的问题是,我有在包含-大量的信息,100ish列的数据库视图,vwComponantAEF5映射IQueryable的自定义类列属性

我有我的中的一个实体。 net应用程序称为ComponantA,其中包含使用[Column()]属性的所有映射,这很好,可以工作,但速度很慢,因为它在数据库上执行select *来填充对象,而且这种方法仍然有效。

为了解决上述性能问题,我介绍了DynamicLinq。这使我能够减少回收的列数量,并且仍然允许使用类型安全性来使用正常的Linq查询,这非常棒。然后处理裁减字段,我带回了POCO组件,每个组件都有自己的一组[Column]属性,它们在运行时使用映射类映射。

问题是,在处理大型数据集时,这些映射之间的映射可能非常缓慢,10000条记录映射10000次等.EF所做的是创建一个DynamicProxyClass,然后在组件之间进行映射。

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

必须有一种方法来利用[列]属性,同时保持查询动态。

这是所有的代码第一和实体框架5.

感谢您的帮助。尼克

回答

0

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

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

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

+0

我这样做的原因是因为某些特定类型的列中存在特定的规则。即视图上有5列表示所有东西,但只有一列我想要映射回我的对象​​上的通用属性。这有意义吗? –

+0

我仍然不明白为什么它应该是与投影问题,你明确地说哪个列被分配到哪个属性。 –

+0

好吧,所以我使用DynamicSQL的原因是,例如我有一个5列的视图,它们都有类似的含义,但取决于用户通过UI选择的内容,其中一个需要映射回一个名为'结果“,这个属性然后推动了很多逻辑。所以它不像“结果= c.Outcome”那么简单,更像是“结果= c。<在运行时确定的属性>”。我想问题是,我怎么能用你上面提出的建议来做到这一点? (我可能更困惑你 - 让我把一些东西放在zerobin上) –