帮助linqtosql类的通用存储库

时间:2009-09-04 17:48:42

标签: linq-to-sql repository repository-pattern

我正在尝试编写一个通用存储库,它将在我所有的linq2sql类上执行基本方法。 (getById,insert,delete,getAll)

我不太确定如何完成这项工作。 继承了我到目前为止所得到的... getById方法给了我一个错误,因为它无法将Id属性与'T'类相关联。我会很感激有关如何围绕这个通用类概念的一些指示

    public class Repository<T> where T:class
{
    private ClassesDataContext db = new ClassesDataContext();


public IQueryable<T> getAll() 
{
    return db.GetTable<T>();
}
public T getById(int id)
{
    db.GetTable<T>().Where(e=>e.Id==id);
    return db.GetTable<T>().Single(c =>c.Id==id);
}}

3 个答案:

答案 0 :(得分:2)

这必须帮助你 - http://csainty.blogspot.com/2008/04/linq-to-sql-generic-primary-key.html

MyDataContext db = new MyDataContext();
Product p = db.GetByPk<Product>(1);

答案 1 :(得分:0)

在您的存储库类中,它会将类型为T的所有实例视为一个对象(它没有Id属性)。

要获得一些通用支持,您可以创建一个基本实体类,如下所示:

public abstract class EntityBase
{
    public int Id {get; private set; }
}

并使存储库将使用的所有实体都继承自此类。

然后,您需要更新您的存储库类定义以包含此而不是您拥有的那个:

public class Repository<T> where T: EntityBase

这将允许将存储库方法中的所有T类型实例视为EntityBase,后者定义Id方法。

答案 2 :(得分:0)

您不能使用lamba表达式(getById方法中的Where子句)来检索项目,因为类型T不知道属性。

您必须构建一个SQL字符串并执行它。

string query = "SELECT * FROM [SomeTable] WHERE [SomeColumn] = {0}";
return db.ExecuteQuery<T>(query, id).FirstOrDefault();

您必须为类型T获取TableName和PrimaryKeyName。您可以使用以下命令获取表名:

db.Mapping.GetTable(typeof(T)).TableName;

您可以使用以下方式获取主键列列表:

db..Mapping.GetTable(typeof(T)).RowType.IdentityMembers.Select(m => m.MappedName).ToArray();

如果您不介意让每个存储库从基类继承,您可以简单地为TableName和PrimaryKey设置两个字段。

为Linq2Sql构建完整的通用DAL / Repository有很多工作要做。它真的很有趣,为分离的实体创建通用的Save,Update方法。

-Douglas H。