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

jaf*_*ffa 32 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
Run Code Online (Sandbox Code Playgroud)

2)首次尝试:

from a in Actions.Include("User")
join u in Users on a.UserId equals u.UserId
select a
Run Code Online (Sandbox Code Playgroud)

但是没有填充Action.User .

3)尝试将"User"加载到查询之外的导航属性中:

(from a in Actions
join u in Users on a.UserId equals u.UserId    
select a).Include("User")
Run Code Online (Sandbox Code Playgroud)

在LINQPad尝试包含的我收到一个错误:

'System.Linq.IQueryable'不包含'Include'的定义,也没有扩展方法'Include'接受类型'System.Linq.IQueryable'的第一个参数可以找到(按F4添加using指令或程序集引用)

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

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

jaf*_*ffa 60

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

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

智能感知在查询后没有显示包含的原因是因为我需要使用以下内容:

using System.Data.Entity;
Run Code Online (Sandbox Code Playgroud)

这一切都很好.

  • 假设您的实体在上下文中正确映射,则连接将自动发生.您可以使用更简单的查询来实现相同的目的:`var qry = from a Actions.Include("User")选择a`如果您正在加入未明确映射为导航属性的实体(即:Action没有用户)属性,或由于某种原因未映射为Navigation属性),那么你需要连接,删除Include,然后你可以使用`select new {Action = a,User = u}`让EF返回加入数据.(后者通常被称为投影) (4认同)

Enr*_*lio 16

如果你想要的是一个查询,它将通过外键属性返回Action其关联User实体实际存在的所有实体,这将执行:Action.UserId

var results = context.Actions
    .Include("User")
    .Where(action =>
        context.Users.Any(user =>
            user.UserId == action.UserId));
Run Code Online (Sandbox Code Playgroud)

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

var results = context.Actions
    .Include("User")
    .Where(action => action.User != null);
Run Code Online (Sandbox Code Playgroud)

如果您的模型声明该Action.User属性永远不能为null(即Action.UserId外键在数据库中不可为空),并且您想要的实际上是所有Action具有关联的实体Users,则查询变得更简单

var results = context.Actions.Include("User");
Run Code Online (Sandbox Code Playgroud)


K0D*_*0D4 16

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

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

要么

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

更新3/31/2017

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

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

  • 感谢您的“nameof()”。我不断看到表名称的硬编码字符串。 (2认同)