如何仅使用List <t> for 2 Entity来获取列表对象?</t>

时间:2012-04-09 07:30:46

标签: c#

在我的项目中,我有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()。我想要的只是只有一个函数Ge​​tList()像这样

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 个答案:

答案 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();
    }        
}