2011-03-27 50 views
1

我通過自己的ID獲取單個實體寫入方法檢索實體泛型方法:實體框架4 - 通過ID

public Customer GetCustomer(int i_CustomerID) 
{ 
    return (from c in context.CustomerSet 
     where c.Id == i_CustomerID 
     select c).SingleOrDefault();    
} 

public Movie GetMovie(int i_MovieID) 
{ 
    return (from m in context.MovieSet 
     where m.Id == i_MovieID 
     select m).SingleOrDefault(); 
} 

但我有許多實體和重演這段代碼。我想寫一個這樣的方法:

public T GetEntityByID<T>(int i_EntityID) 
{ 
    return (from e in context.T_Set 
     where e.Id == i_EntityID 
     select e).SingleOrDefault(); 
} 

有沒有辦法做到這一點?

+0

你可以找到一個類似的問題[這裏](http://stackoverflow.com/questions/248682/create-llblgen-linq-query-dynamicly-with-strings) – Menahem 2011-03-27 09:58:30

回答

3

我還沒有實際執行這一點,但它編譯並可能是沿着你想要達到什麼東西行:

public static void Testing() 
    { 
     SelectEntity<MyObject>(r => r.MyObjectId == 1); 
    } 

    public static T SelectEntity<T>(Expression<Func<T, bool>> expression) where T : EntityObject 
    { 
     MyContext db = new MyContext(); 
     return db.CreateObjectSet<T>().SingleOrDefault(expression); 
    } 
+0

這是一個很好的解決方案,但不喜歡使用lambda的想法。想以某種方式只是給一個int。 – 2011-03-27 21:45:32

+0

您可以爲實體實現一個接口(例如IPrimaryKey)的第二個部分類聲明掛接主鍵以表示MyEntity.PrimaryId,然後在T:IPrimaryKey中創建泛型方法。或者你有沒有考慮嘗試使用EntityKey?我認爲有可能從實體關鍵信息中挖掘出主鍵... – Rob 2011-03-28 11:35:37

1

問題是沒有公共超級類型具有您尋求的相關屬性。但是,使用EF正在使用的內置T4代碼生成工具來編寫生成您的提取方法的代碼很容易。這裏有一個關於如何掛鉤並生成你需要的代碼的好鏈接。

http://msdn.microsoft.com/en-us/data/gg558520

0

如果你知道你的通用存儲庫將是總是與具有相同名稱和相同類型的PK的實體類型一起使用,您可以簡單地定義如下界面:

public interface IEntity 
{ 
    int Id { get; } 
} 

d要麼在你生成的實體的一部分中實現這個接口,要麼修改T4模板以自動包含它。您的倉庫將被再定義爲:

public interface IRepository<TEntity> where T : IEntity 
{ 
    ... 
} 

如果PK的類型可以改變,但名稱仍然是可以改善實體的接口是相同的:

public interface IEntity<TKey> 
{ 
    TKey Id { get; set; } 
} 

和存儲庫的定義將是:

public interface IRepository<TEntity, TKey> where TEntity : IEntity<TKey> 
{ 
    ... 
} 

如果你想一般存儲庫,它能夠與不同的PK的名字實體合作,並輸入查詢this answer。該解決方案也可能適用於複合材料PK(或稍作修改)。

+0

這看起來像很多工作來節省一些工作:-) – 2011-03-27 21:33:12

+0

我不明白爲什麼我需要IRepository for?我如何使用它? – 2011-03-27 21:42:45

+0

存儲庫是一種用於抽象數據層的模式。如果你仔細想一想,它就和DBContext一樣。 – Burt 2015-04-22 10:19:18