C#Linq to SQL创建通用存储库

C#Linq to SQL创建通用存储库,c#,linq-to-sql,repository-pattern,C#,Linq To Sql,Repository Pattern,我有几个存储库,通常都是这样的 public class DepartmentsRepository { private PersonnelActionFormDataContext db = new PersonnelActionFormDataContext(); /// <summary> /// returns all departments /// </summary> /// <returns>an iqu

我有几个存储库,通常都是这样的

public class DepartmentsRepository
{
    private PersonnelActionFormDataContext db = new PersonnelActionFormDataContext();

    /// <summary>
    /// returns all departments
    /// </summary>
    /// <returns>an iquerable of all departments</returns>
    public IQueryable<Department> GetAll()
    {
        return db.Departments;
    }

    /// <summary>
    /// Get department by id
    /// </summary>
    /// <param name="id">id of the department</param>
    /// <returns>a null department if nothing is found</returns>
    public Department Get(int id)
    {
        return db.Departments.SingleOrDefault(d => d.id == id);
    }

    /// <summary>
    /// Get department by department name
    /// </summary>
    /// <param name="department">name of the department</param>
    /// <returns>a null department if nothing is found</returns>
    public Department Get(string department)
    {
        return db.Departments.SingleOrDefault(d => d.DepartmentName == department);
    }

    /// <summary>
    /// Add a department
    /// </summary>
    /// <param name="department"></param>
    public void Add(Department department)
    {
        db.Departments.InsertOnSubmit(department);
    }
公共类部门声明
{
private PersonnelActionFormDataContext db=new PersonnelActionFormDataContext();
/// 
///返回所有部门
/// 
///一份所有部门的报告
公共IQueryable GetAll()
{
返回数据库部门;
}
/// 
///凭身份证到部门
/// 
///部门id
///如果未找到任何内容,则为空部门
公共部门获取(int id)
{
返回db.Departments.SingleOrDefault(d=>d.id==id);
}
/// 
///按部门名称获取部门
/// 
///部门名称
///如果未找到任何内容,则为空部门
公共部门Get(字符串部门)
{
返回db.Departments.SingleOrDefault(d=>d.DepartmentName==department);
}
/// 
///增加一个部门
/// 
/// 
公共作废添加(部门)
{
db.部门。InsertOnSubmit(部门);
}
我想有一些通用基类,可以节省我一些打字,所以我从这里开始

 public class GenericRepository<T>
{
    private PersonnelActionFormDataContext db = new PersonnelActionFormDataContext();

    public IQueryable<T> GetAll()
    {
        return db.
    }
}
公共类通用存储库
{
private PersonnelActionFormDataContext db=new PersonnelActionFormDataContext();
公共IQueryable GetAll()
{
返回db。
}
}
如何访问Ts集合以返回它们?这可能吗


感谢您的帮助。

对于Linq to SQL,应该可以:

public IQueryable<T> GetResultL2S<T>() where T : class {
    MyDataContext db = new MyDataContext();
    return db.GetTable<T>();
}
public IQueryable GetResultL2S(),其中T:class{
MyDataContext db=新的MyDataContext();
返回db.GetTable();
}
或者,如果您使用的是实体框架,那么您可以执行以下操作:

public IQueryable<T> GetResultEF<T>() {
    YourEntities db = new YourEntities();
    return db.CreateQuery<T>(String.Format("[{0}s]", typeof(T).Name));
}
public IQueryable GetResultEF(){
YourEntities db=新建YourEntities();
返回db.CreateQuery(String.Format(“[{0}s]”,typeof(T.Name));
}

假设您的实体集可以通过在上加一个s来实现多元化。如果不是这样,请查看
System.Data.entity.Design.PluralizationServices.PluralizationService

什么是db-这是linq到sql,还是实体框架?linq到sql…我更新了标记。感谢这实际上让它更容易-请参阅我更新的答案Public T Get(int-id),其中T:class{return db.GetTable().SingleOrDefault(d=>d.id==id);}像这样的东西不起作用。有什么想法吗?怎么可能?C#不知道任何t都有一个id属性。你必须说出t的位置:class,IsomeInterfaceWithIdpropertyOnitor如果这样的接口不可用,你必须从头构建一个表达式树,这可能会变得迟钝。下面是一个简单的例子(仅使用EF而非L2S进行测试)啊,看起来不错。好的……那么,我是否必须为我的dbcontext对象创建分部类,然后使用id属性实现一个iEntity,然后执行类似的操作,其中T:iEntity……然后这些将起作用。有更好的方法吗?如果您是ha,这是我不久前编写的L2的通用主键函数转换EF-1时遇到困难。