2012-09-06 81 views
0

考虑这个查询迁移旧ado.net web应用程序EF

Select (some properties from all 3 Tables) 
    From PageWidgets pw LEFT JOIN PageWidgetDefinition pwd 
     On pwd.ID = pw.WidgetID 
    LEFT JOIN PageWidgetSkin pws 
     ON pws.ID = pw.SkinInstanceID 
    LEFT JOIN PageWidgetSkinRows pwsr 
     On pwsr.SkinID = pws.ID Where pw.PageID = *x* 
    Order By (some properties) 
在旧的实现

,它的网页&自己的皮肤&我已经通过行循环函数返回&使由pagewidget上读取部件的其小部件实例皮肤&。 每个插件具有三排它的皮肤,最后我们收到了需要运行

我在EF有这些类的一切列表

public partial class Widget: BaseEntity { 
    public int ID { get; set; } 

    public int PageTemplateID { get; set; } 
    public PageTemplate PageTemplate { get; set; } 

    public int WidgetDefinitionID { get; set; } 
    public WidgetDefinition WidgetDefinition { get; set; } 

    public int WidgetSkinID { get; set; } 
    public WidgetSkin WidgetSkin { get; set; } 
      //other properties omitted 

} 


public partial class WidgetDefinition: BaseEntity {    
    public int ID { get; set; } 
    public string Title { get; set; } 
      //other properties omitted 
    public virtual ICollection<Widget> Widgets { get; set; } 
} 



public partial class WidgetSkin: BaseEntity { 
    public int ID { get; set; } 
    public string Name { get; set; } 
      //other properties omitted 

    public virtual ICollection<Widget> Widgets { get; set; } 
    public virtual ICollection<WidgetSkinRow> WidgetSkinRows { get; set; } 
} 



public partial class WidgetSkinRow: BaseEntity { 

    public int ID { get; set; } 

    public int WidgetSkinID { get; set; } 
    public virtual WidgetSkin WidgetSkin { get; set; } 
} 

我需要一个额外的经营业务层做同样的事情?

使用EF,我想只有一次旅行到DB。

回答

1

您可以使用“急切加载”方法来执行此操作。

您的查询将然后是这个样子:

using (var entities = new WidgetEntities()) 
{ 
    var query = from w in entities.Widgets.Include("WidgetDefinition").Include("WidgetDefinition.Widgets").Include("WidgetSkins").Include("WidgetSkins.WidgetSkinRows") 
    where w.Page = *x* 
    order by w.someproperty 
    select w; 

    Widget myWidget = query.First(); 
} 
相关问题