0

在我的项目中,我有 2 个实体对象(代表 db 中的 2 个表),如下所示:

  • Tbl_Person {ID,姓名}
  • Tbl_Class {ID,名称,PersonID}

在 DAL 中,我为这些实体创建 2 个类,并编写函数 GetList() : - Class Person:

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;
        }
    }
}

我的班级:

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;
        }
    }
}
4

2 回答 2

2

首先,摆脱无意义的try/catch 块。这些方法中的每一个都是所需时间的两倍,因为您正在捕获异常并重新抛出它们 - 但同时会丢失信息!(如果您必须重新抛出,请使用 justthrow;而不是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。)

于 2012-04-09T07:36:05.747 回答
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();
    }        
}
于 2012-04-09T07:43:37.697 回答