2010-04-16 71 views
1

在我的Custom ObjectContext類中,我的實體集合暴露爲IObjectSet,因此它們可以進行單元測試。我遇到了一個問題,當我在編譯的查詢使用的ObjectContext,並呼籲「包括」擴展方法(朱莉·勒曼的博客http://thedatafarm.com/blog/data-access/agile-entity-framework-4-repository-part-5-iobjectset/):IObjectSet包含CompiledQuery的擴展方法錯誤

public IQueryable<MyPocoObject> RunQuery(MyCustomContext context, int theId) 
    { 
     var query = CompiledQuery.Compile<MyCustomContext, int, IQueryable<MyPocoObject>>(
      (ctx, id) => ctx.MyPocoObjects.Include("IncludedPocoObject").Where(n => n.IncludedPocoObject.id == id)); 

     return query(context, theId); 
    } 

LINQ到實體無法識別方法「System.Linq的.IQueryable 1[MyPocoObject] Include[MyIncludedPocoObject](System.Linq.IQueryable 1 [MyPocoObject],System.String)'方法,並且此方法不能轉換爲存儲表達式。

如果我在ObjectSet集合而不是IObjectSet上使用這個相同的查詢,它工作正常。如果我只是簡單地運行這個查詢而不進行預編譯,它就能正常工作我在這裏錯過了什麼?

+0

我遇到了同樣的問題,您是否找到解決方案? – Paul 2010-08-08 00:15:40

回答

0

我敢肯定,我剛剛誤解了,因爲您似乎一直在尋找這一點 - 但是不應該包括ObjectSet而不是該對象集所查詢的對象。

如:

var query = CompiledQuery.Compile<MyCustomContext, int, IQueryable<MyPocoObject>>(
    (ctx, id) => ctx.MyPocoObjects.Include("IncludedPocoObjectSET").Where(n => n.IncludedPocoObject.id == id)); 

你能否確認,運行相同的查詢,而無需進行編譯不拋出「不能轉換」異常?

+0

這裏是使用IobjectSet時引發的查詢的示例,而不是使用ObjectSet時的查詢 private static readonly表達式>>表達式=(database,slug)=> database.SiteAnnouncements。包含(「UserCreated」)。其中(sa => sa.Site.Slug == slug); private static readonly Func <數據庫,字符串,IEnumerable > compiledQuery = CompiledQuery.Compile(表達式); – Paul 2010-08-14 16:10:40

+0

完整的錯誤:LINQ to Entities無法識別方法'System.Linq.IQueryable'1 [PostHope.Core.DomainObjects.SiteAnnouncement] Include [SiteAnnouncement](System.Linq.IQueryable'1 [PostHope.Core.DomainObjects.SiteAnnouncement] ,System.String)'方法,並且此方法不能轉換爲商店表達式 – Paul 2010-08-14 16:22:51

+0

好的,如果這是無意義的,那麼我可能會有點出於我的深度而非常抱歉:當通過接口引用對象集時,它就是定義的接口上的方法,而不是對象上的方法 - 在編譯(檢查反射器)後,對象集的方法/屬性是否有任何特殊屬性或編譯器提示,但接口上不存在? – Basic 2010-08-14 18:40:49

相關問題