2012-04-09 35 views
0

在我的項目,我有2個實體對象(代表在DB 2個表)如下:如何通過僅使用列表<T>獲取2個實體的列表對象?

  • Tbl_Person {ID,名稱}
  • Tbl_Class {ID,名稱,是PersonID}

在DAL,創建)2類爲這些實體,和寫功能的GetList(: - 類人:

public List<Tbl_Person> GetList() 
{ 
    using (var db = DatabaseHelper.DataContext()) 
    { 
     try 
     { 
      var _t = (from info in db.**tbPerson** 
         select info).ToList(); 
      return _t.ToList<**Tbl_Person**>(); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 
} 

MyClass類:

public List<Tbl_Class> GetList() 
{ 
    using (var db = DatabaseHelper.DataContext()) 
    { 
     try 
     { 
      var _t = (from info in db.**tbClass** 
         select info).ToList(); 
      return _t.ToList<**Tbl_Class**>(); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 
} 

如果我用2班,我可以使用的GetList()來正確地獲取列表對象。 但似乎我們在這裏有重複函數GetList()。我只想爲只有1功能的GetList()這樣的

public List<T> GetList() 
{ 
    using (var db = DatabaseHelper.DataContext()) 
    { 
     try 
     { 
      var _t = (from info in db.**????????** 
         select info).ToList(); 
      return _t.ToList<**T**>(); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 
} 

回答

2

首先,擺脫無意義 try/catch塊的。這些方法中的每一個都需要它的兩倍,因爲你捕捉異常並重新拋出它們 - 但同時丟失了信息! (如果你必須重新拋出,使用的只是throw;代替throw ex;。)

其次,絕對在這裏使用查詢表達式是沒有意義的。你只是對整個桌子感興趣。 (您是否確定順便說一句,您想在每次調用時取整個表格)

第三,假設這些都是正確的強類型數據上下文,我不希望您必須指定類型參數ToList首先。

所以你的兩個方法可以*實際上可以簡化爲:

// In MyClass 
public List<Tbl_Class> GetList() 
{ 
    using (var db = DatabaseHelper.DataContext()) 
    { 
     return db.tbClass.ToList(); 
    } 
} 

// In Person 
public List<Tbl_Person> GetList() 
{ 
    using (var db = DatabaseHelper.DataContext()) 
    { 
     return db.tbPerson.ToList(); 
    } 
} 

現在你可以這裏使用DataContext.GetTable<TEntity>刪除冗餘:

// In DatabaseHelper: 
public static List<T> GetList<T>() 
{ 
    using (var db = DataContext()) 
    { 
     return db.GetTable<T>().ToList(); 
    } 
} 

// In MyClass 
public List<Tbl_Class> GetList() 
{ 
    return DatabaseHelper.GetList<Tbl_Class>(); 
} 

// In Person 
public List<Tbl_Person> GetList() 
{ 
    return DatabaseHelper.GetList<Tbl_Person>(); 
} 

這不是真的清楚你是否需要各個班級的方法...

(除了所有這些,我強烈建議您重新命名您的類型以從映射中刪除Tbl_前綴。它在代碼,IMO看起來非常可怕)。

+1

是的。你肯定會幫助我很多。 我現在可以用動態表獲得列表。 您的第一個意見,請給我一個關於try/catch的例子嗎?因爲當我試圖用我的try/catch進行調試時,它的工作原理是正確的,不會像你的意見那樣發生。 非常感謝。 – 2012-04-09 10:33:28

+1

@ThangLang:如果你在'throw ex'的時候記錄堆棧跟蹤,你將看不到'* original *'異常 - 你會得到那條線。這會丟失信息。只要使用'throw;'效果更好......但如果你只是*捕獲一個異常來重新拋出它,那麼就完全移除try/catch塊,它將在沒有任何混亂的情況下達到相同的效果。 – 2012-04-09 13:59:44

1

可能實現你要求使用實體框架和IObjectSet。我不確定這是一個明智的想要做的事情。

public class Repository 
{ 
    private readonly IObjectContext _context; 

    public void Repository(IObjectContext context) 
    { 
     _context = context; 
    } 

    public IEnumerable<T> GetList<T>() where T : class 
    { 
     return _context.CreateObjectSet<T>().ToList(); 
    }   
} 
相關問題