2009-12-02 49 views
1

使用LINQ到实体,我有以下代码:是否有可能重构此使用泛型?

public Foo GetFooByID(int id) 
{ 
return _db.Foo.First(m => m.ID == id); 
} 

public Bar GetBarByID(int id) 
{ 
return _db.Bar.First(m => m.ID == id); 
} 

有没有办法来重构这个使用泛型?

回答

2

你可以做类似的LINQ to SQL的DataContext.GetTable方法:

public T GetById<T>(int id) 
{ 
    return _db.GetTable<T>().First(m => m.ID = id); 
} 

您需要调用它像这样:

GetById<Foo>(10); 
GetById<Bar>(10); 
+0

这看起来完全像我所希望的,但LINQ到实体不使用的DataContext。 – chris 2009-12-02 15:27:48

+0

您可以在_db上使用Type.GetProperties来查看它是否具有类型T的任何属性。 – scottm 2009-12-02 15:37:52

+0

由于某种原因,Type.GetType(“myEDMX”)返回null。 – chris 2009-12-02 15:51:47

0

你需要抽象的访问属性Foo和首先在_dbBar。然后泛型部分变得非常简单。

public T GetByID<T>(int id) 
{ 
return _db.GetCollection<T>().First<T>(m => m.ID == id); 
} 

如果编译器抱怨,您可能需要将T约束为具有ID属性的类型。

public T GetByID<T>(int id) where T : IHaveID 
{ 
} 
相关问题