我在下面有一个查询,但我想对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本身。
答案 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。这对我有用: - )