在我的项目中,我有2个Entity对象(db中2个表的委托),如下所示:
- Tbl_Person {ID,Name}
- Tbl_Class {ID,Name,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;
}
}
}
Class 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()。我想要的只是只有一个函数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;
}
}
}
答案 0 :(得分: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 :(得分:1)
您可以实现您使用Entity Framework和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();
}
}