使用Load with Select的实体框架 - 是否可能?

时间:2014-06-02 13:00:36

标签: c# entity-framework

我正在尝试优化我的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();

加载子集合时是否可以进行细粒度控制?

1 个答案:

答案 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
}

但在这种情况下,您将无法获得上下文附加实体。