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)
这一切都很好.
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)