0

このクエリを検討してください

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)

古い実装では、ページ上のウィジェットとそのスキンを読み取り、返された行をループする関数があり、スキンとウィジェットインスタンスによってページウィジェットを作成します。各ウィジェットにはスキン用の 3 つの行があり、最後に操作に必要なすべてのリストを受け取ります

私は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回だけにしたいです。

4

1 に答える 1

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();
} 
于 2012-09-06T17:50:43.793 に答える