2011-12-02 45 views
2

据我所知,编译查询不是现在支持实体框架代码优先(4.2)。 不使用编译查询的性能很高,所以我试图找到解决方案。实体框架CF(DbContext)和编译查询

我现在已经完成了以下工作: 创建一个从ObjectContext继承的新类 - 使用相同的EntityConnection将它与DbContext一起实例化。使用CreateObjectSet <>为实体创建ObjectSet,并将该conext用于已编译的查询。这是有效的(对于小型查询,性能提升10倍),但是由于需要为每个新实体(!DRY)创建ObjectSet属性,所以它非常麻烦。

有没有人知道解决这个问题的更优雅的方式?

回答

2

看起来你正在使用DbContext和EDMX。如果查询性能是您的主要关注点,并且您需要使用编译查询,那么请不要使用DbContext API并使用ObjectContext API编写整个应用程序。对应用程序的一半使用ObjectContext,对应用程序的后半部分使用DbContext必须导致代码重复。

DbContext API有一些限制,它可能不会支持在不久的将来选择性编译查询。 EF的下一个版本将提供自动编译和重用所有LINQ查询的可能性。

+0

我没有使用EDMX的DbContext,我使用从DbContext生成的EntityConnection来创建我自己的ObjectContext,它现在由T4生成。如果有的话,非常少的代码重复。但它感觉很不舒服,但比在DbContext上使用EDMX和ObjectContext更好。所以没有其他方式使用编译查询,而不是我目前的做法(当然,先使用代码)? – Jsfsn

+0

谢谢拉迪斯拉夫。我不得不使用ObjectContext作为我的应用程序的一部分,尽管它有相当多的重构(但主要是重命名和修复名称空间),但我终于可以使用编译查询。我读过ef代码的编译查询,首先将在.net 4.5中。它是2011年6月CTP的一部分,但尚未正式发布。 +1 –