2011-12-16 58 views
4

我試圖在這篇文章中應用這個建議:Tip 22 - How to make Include really Include如何將IQueryable <T>轉換爲ObjectQuery <T>?

它提出了一個解決方案,以確保實體框架(4.2)中的熱切加載工作。該解決方法涉及將IQueryable轉換爲ObjectQuery。

但是,當我嘗試這一點,如帖子所示,查詢返回一個空值。

我的查詢(CTX是的DbContext):

IEnumerable<Coupon> coupons = 
    from x in ctx.Coupons 
    where x.LanguageCode.Equals("EN", StringComparison.InvariantCultureIgnoreCase) && x.CategoryId == MainCategoryId && x.Date >= fromDate && x.Date <= toDate 
    select x; 

按預期工作。

然而,當我使用,

IEnumerable<Coupon> coupons = 
    (from x in ctx.Coupons 
    where x.LanguageCode.Equals("EN", StringComparison.InvariantCultureIgnoreCase) && x.CategoryId == MainCategoryId && x.Date >= fromDate && x.Date <= toDate 
    select x) as ObjectQuery<Coupon>; 

一個null分配給 「優惠券」。

任何想法我做錯了什麼?

+0

如果使用`var`而不是`IEnumerable ``會怎麼樣? `IQueryable `和`IEnumerable `不是一回事。 – GalacticCowboy 2011-12-16 18:35:48

+1

您的ctx是DbContext還是ObjectContext? ObjectQuerys僅用於ObjectContexts。您還可以在調試器中檢查coupons.GetType(),以查看查詢的真實類型。 – hvd 2011-12-16 18:42:14

回答

5

從意見的答案:

鑄造到ObjectQuery<T>只能在查詢確實是一個ObjectQuery<T>,它不會對任何其他IQueryable<T>工作。由於您使用的是DbContext而不是ObjectContext,因此查詢的類型不同。但是,您不需要轉換爲正確的類型,命名空間中的DbExtensions.Include擴展方法接受任何IQueryable<T>類型,並調用相應的基礎Include方法。你可以使用它,避免強制轉換,從而避免在代碼中明確指定查詢的類型。

4

,你在做什麼,就相當於本

IEnumerable<Coupon> coupons = 
    from x in ctx.Coupons 
    where x.LanguageCode.Equals("EN", StringComparison.InvariantCultureIgnoreCase) && x.CategoryId == MainCategoryId && x.Date >= fromDate && x.Date <= toDate 
    select x; 

ObjectQuery<Coupon> converted = coupons as ObjectQuery<Coupon>; 

,與coupons NOT NULL和converted空。這意味着劇組失敗了。
這並不能解決您的問題,但至少可以識別它。

也許您正在使用不同版本的實體框架?

相關問題