【发布时间】:2012-01-22 01:55:14
【问题描述】:
我正在尝试应用这篇文章中的建议:Tip 22 - How to make Include really 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;
按预期工作。
但是,当我使用时,
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>;
它为“优惠券”分配一个空值。
知道我做错了什么吗?
【问题讨论】:
-
如果您使用
var而不是IEnumerable<Coupon>会怎样?IQueryable<T>和IEnumerable<T>不是一回事。 -
你的 ctx 是 DbContext 还是 ObjectContext? ObjectQuerys 仅与 ObjectContexts 一起使用。您还可以在调试器中检查 coupons.GetType(),以查看查询的真正类型。
-
谢谢。我更新了帖子说我正在使用 DBContext。
-
在这种情况下,唯一的答案可能是“您不能将
IQueryable<T>转换为ObjectQuery<T>,除非IQueryable<T>确实是ObjectQuery<T>。”不过,我想知道为什么你真的需要它。在您的查询中,您首先不需要解决方法,但如果您这样做了,假设您是using System.Data.Entity;,(from x in ctx.Coupons ... select x).Include(...)是否不能解决问题? -
@Hvd。谢谢。我在 using 声明中没有 System.Data.Entity 并且依靠 Intellisense 来确定允许的内容 - 所以我认为我不能使用 .Include !然后开始阅读一篇“证实”这种误解的旧博客文章。嗬!我猜不应该在疲倦和沮丧时编码。如果您想发布答案,我会接受它 - 或者我会在几天后自行回答,参考您的评论。
标签: c# .net iqueryable eager-loading objectquery