2012-04-09 36 views
0

在我的项目,我有2个实体对象(代表在DB 2个表)如下:如何通过仅使用列表<T>获取2个实体的列表对象?

  • Tbl_Person {ID,名称}
  • Tbl_Class {ID,名称,是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; 
     } 
    } 
} 

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()。我只想为只有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; 
     } 
    } 
} 

回答

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

是的。你肯定会帮助我很多。 我现在可以用动态表获得列表。 您的第一个意见,请给我一个关于try/catch的例子吗?因为当我试图用我的try/catch进行调试时,它的工作原理是正确的,不会像你的意见那样发生。 非常感谢。 – 2012-04-09 10:33:28

+1

@ThangLang:如果你在'throw ex'的时候记录堆栈跟踪,你将看不到'* original *'异常 - 你会得到那条线。这会丢失信息。只要使用'throw;'效果更好......但如果你只是*捕获一个异常来重新抛出它,那么就完全移除try/catch块,它将在没有任何混乱的情况下达到相同的效果。 – 2012-04-09 13:59:44

1

可能实现你要求使用实体框架和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(); 
    }   
} 
相关问题