2012-08-30 61 views
4

我正在使用EF4.3和DbContext。有條件地在實體框架中包含()

我有一個存儲在緩存中的實體,因此我需要在轉換爲列表並將其彈出緩存之前加載必要的數據。

我的數據庫是標準化的,因此數據分佈在多個表格上。基本實體是「用戶」,用戶可以是也可以不是「訂戶」,訂戶可以是「貢獻者」,「成員」或「管理員」3種類型中的一種

目前整個提取不是由於我在EF中缺乏知識而非常優雅,Linq et al。

public static User Get(Guid userId) 
    { 
     Guard.ThrowIfDefault(userId, "userId"); 

     var r = new CrudRepo<User>(Local.Items.Uow.Context); 

     var u = r.FindBy(x => x.UserId == userId) 
      .Include("BookmarkedDeals") 
      .Include("BookmarkedStores") 
      .SingleOrDefault(); 

     if (u.IsNotNull() && u.IsActive) 
     { 
      if (u.IsAdmin) 
      { 
       u.GetAdministrator(); 
      } 
      else if (u.IsContributor) 
      { 
       u.GetContributor(); 
      } 
      else if (u.IsMember) 
      { 
       u.GetMember(); 
      } 
      else 
      { 
       string.Format("Case {0} not implemented", u.UserRoleId) 
        .Throw<NotImplementedException>(); 
      } 
     } 

     return u; 
    } 

每個'Get'方法都獲得一個Subscriber實體以及該角色類型的相關Include()實體。

我敢肯定,它可以做得比這更大,但與最初的思考過程掙扎。

任何幫助?

更新,例如get方法一個

public static void GetMember(this User user) 
    { 
     Guard.ThrowIfNull(user, "user"); 

     var r = new ReadRepo<Subscriber>(Local.Items.Uow.Context); 

     user.Subscriber = r.FindBy(x => x.UserId == user.UserId) 
      .Include("Kudos") 
      .Include("Member.DrawEntries") 
      .Include("Member.FavouriteCategories") 
      .Include("Member.FavouriteStores") 
      .Single(); 
    } 
+0

個人而言,我不介意這一點。我不知道我有多喜歡可以獲得其他實體的實體的方法。我不會親自這樣做,因爲我喜歡我的實體純粹和乾淨的數據存儲。我不寫這個作爲答案,因爲這是意見。我認爲如果它適合你,並且它的可讀性好,它很好。我始終在考慮這一點:根據需要更改您的功能代碼。不只是因爲你認爲它看起來很醜?總會有更大的魚在那裏f魚。 –

+0

你能展示一個「Get ...」方法嗎? – Slauma

+0

@Slauma添加了一個例子 – dotnetnoob

回答

0

如果您的「用戶」實體連接到您的其他實體可以使用所連接的實體集的Load方法來獲取相關的實體。例如,如果您的「用戶」實體擁有「訂閱者」屬性,則可以調用u.Subscriber.Load()來獲取相關實體。這裏是相關MSDN article

0
var u = r.FindBy(x => x.UserId == userId) 
     .Include("BookmarkedDeals") 
     .Include("BookmarkedStores") 
     .SingleOrDefault(); 

if(someCondition) 
{ 
    u = u.Include("something"); 
} 

沒有一個地方來測試這個,但你有沒有嘗試過嗎?