我正在尝试优化我的EF查询,但我坚持使用这个。
假设我有一个这样的模型:
public class House
{
public int ID { get; set; }
public ICollection<Window> Windows { get; set; }
}
public class Window
{
public int ID { get; set; }
public string Color { get; set; }
public WindowKind Kind { get; set; }
}
public class WindowKind
{
public int ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
我想要做的是显式加载所有窗口并指定WindowKind
属性中应该填充的内容。
我知道我可以用.Include()
这样做:
var house = Context.Houses.Single(h => h.ID == id);
var windows = Context.Entry(house).Collection(h => h.Windows).Query().Include(w => w.Kind).Load();
但是,这会创建一个将加载所有WindowKind
属性的查询,例如我只需要Name
。虽然生成的查询看起来不错,但我希望这样的东西可以工作,但它没有,Windows
集合是空的。
var house = Context.Houses.Single(h => h.ID = id);
var windows = Context.Entry(house).Collection(h => h.Windows).Query().Select(w => { new w.Color, w.Kind.Name }).Load();
加载子集合时是否可以进行细粒度控制?
答案 0 :(得分:0)
您无法通过加载实体来加载实体的标量(int,string,...)属性的一部分。
在您的情况下,类似以下内容应该:
from
w in Context.Windows
where
w.House.ID == id // here a navigation property is missing, but (imho) more clear for the sample
select new {
windows = w,
kName = w.Kind.Name
}
但在这种情况下,您将无法获得上下文附加实体。