2012-09-06 83 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(); 
} 
相關問題