LINQ表达式语法如何与Include()一起用于预先加载

时间:2011-07-20 11:23:24

标签: c# linq entity-framework linqpad

我在下面有一个查询,但我想对eager load属性执行Include()。 Actions有一个导航属性User(Action.User)

1)我的基本查询:

from a in Actions
join u in Users on a.UserId equals u.UserId
select a

2)第一次尝试:

from a in Actions.Include("User")
join u in Users on a.UserId equals u.UserId
select a

但是Action.User 已填充。

3)尝试将“用户”加载到查询之外的导航属性中:

(from a in Actions
join u in Users on a.UserId equals u.UserId    
select a).Include("User")

在LINQPad中尝试包含我的错误:

'System.Linq.IQueryable'不包含'Include'的定义,也没有扩展方法'Include'接受类型为'System.Linq.IQueryable'的第一个参数'(按F4添加using指令)或汇编参考)

我认为这是因为LINQ不支持Include()。

所以我在VS中尝试过;查询2运行,但返回未填充的用户属性。 查询3扩展方法似乎不存在,尽管在没有查询的情况下它确实存在于Action本身。

5 个答案:

答案 0 :(得分:59)

我想通了,谢谢你的建议。 解决方案是这样做(在我的问题中第二次尝试):

var qry = (from a in Actions
join u in Users on a.UserId equals u.UserId    
select a).Include("User")

intellisense在查询后没有显示Include的原因是因为我需要使用以下内容:

using System.Data.Entity;

这一切都很好。

答案 1 :(得分:16)

如果您想要的是一个查询,它将通过Action foreign key property返回其关联的User实体实际存在的所有Action.UserId个实体,则可以执行此操作:

var results = context.Actions
    .Include("User")
    .Where(action =>
        context.Users.Any(user =>
            user.UserId == action.UserId));

然而您不必使用外键属性来进行过滤,因为您还有navigation properties。因此,您可以通过过滤Action.User导航属性来简化查询,就像在此示例中一样:

var results = context.Actions
    .Include("User")
    .Where(action => action.User != null);

如果您的模型声明Action.User属性永远不能为空(即Action.UserId外键在数据库中不可为空),那么您想要的实际上是所有Action个实体他们的关联Users,然后查询变得更简单

var results = context.Actions.Include("User");

答案 2 :(得分:13)

更好,重构友好代码(EF6)

using System.Data.Entity;
[...]
var x = (from cart in context.ShoppingCarts
         where table.id == 123
         select cart).Include(t => t.CartItems);

var x = from cart in context.ShoppingCarts.Include(nameof(ShoppingCart.CartItems))
        where table.id == 123
        select cart;

2017年3月31日更新

您还可以在lambda语法中使用include用于任一方法:

var x = from cart in context.ShoppingCarts.Include(p => p.ShoppingCart.CartItems))
        where table.id == 123
        select cart;

答案 3 :(得分:2)

执行发布的问题中提到的基本查询,除非您返回匿名类型,否则您将无法看到用户属性:

from a in Actions
join u in Users on a.UserId equals u.UserId
select new
{
   actionUserId = a.UserId
   .
   .
   .
   userProperty1 = u.UserId
};

但是,要在ObjectContext上使用Include方法,您可以使用以下命令:

请确保使用以下行停用LazyLoading:

entities.ContextOptions.LazyLoadingEnabled = false;

然后继续

var bar = entities.Actions.Include("User");
var foo = (from a in bar
           select a);

答案 4 :(得分:0)

我使用LoadWith选项

var dataOptions = new System.Data.Linq.DataLoadOptions();
dataOptions.LoadWith<Action>(ac => as.User);
ctx.LoadOptions = dataOptions;

多数民众赞成。 ctx 是您的DataContext。这对我有用: - )