如何将IQueryable <T>转换为ObjectQuery <T>?

dom*_*mer 4 .net c# iqueryable objectquery eager-loading

我正在尝试在这篇文章中应用建议:提示22 - 如何使Include真正包括在内

它建议在实体框架(4.2)中确保急切加载的解决方法.该解决方法涉及将IQueryable转换为ObjectQuery.

但是,当我尝试这个时,如帖子所示,查询返回null.

我的查询是(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;
Run Code Online (Sandbox Code Playgroud)

这按预期工作.

但是,当我使用时,

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>;
Run Code Online (Sandbox Code Playgroud)

它为"优惠券"指定了一个空值.

知道我做错了什么吗?

小智 5

从评论到答案:

ObjectQuery<T>仅当查询确实是一个时ObjectQuery<T>,转换为仅适用于它,它将不适用于任何其他查询IQueryable<T>.由于您使用的是a DbContext而不是a ObjectContext,因此查询的类型不同.但是,您不需要强制转换为正确的类型,命名空间中的DbExtensions.Include扩展方法System.Data.Entity接受任何IQueryable<T>类型,并调用适当的基础Include方法.您可以使用它,避免强制转换,从而避免在代码中明确指定查询的类型.