帮助 linqtosql 类的通用存储库

发布于 2024-08-04 10:49:17 字数 529 浏览 1 评论 0原文

我正在尝试编写一个通用存储库,它将在我的所有 linq2sql 类上执行基本方法。 (getById、插入、删除、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);
}}

I am trying to write a generic repository that will perform basic methods on all my linq2sql classes. (getById, insert, delete, getAll)

Im not so sure on how to get this done.
Heres what I got so far... the getById method is giving me an error cause it cant relate Id attribute to 'T' class. I would appreciate some pointers on how to wrap my head around this generic class concept

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

橘香 2024-08-11 10:49:17

这一定可以帮助您 - http:// csainty.blogspot.com/2008/04/linq-to-sql-generic-primary-key.html

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

This must help you out - http://csainty.blogspot.com/2008/04/linq-to-sql-generic-primary-key.html

MyDataContext db = new MyDataContext();
Product p = db.GetByPk<Product>(1);
紫﹏色ふ单纯 2024-08-11 10:49:17

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

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

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

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

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

public class Repository<T> where T: EntityBase

这将允许存储库方法内类型 T 的所有实例被视为 EntityBase - 它定义了 Id 方法。

Inside your repository class it will treat all instances of type T as an object (which doesn't have the Id property).

To have some generic support you can create a base entity class like this:

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

And make all entities that the repository will use inherit from this class.

You would then need to update your repository class definition to contain this where instead of the one you have:

public class Repository<T> where T: EntityBase

This will allow all instances of type T inside your repository methods to be treated as an EntityBase -which defines the Id method.

原来分手还会想你 2024-08-11 10:49:17

您不能使用lambda表达式(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/存储库需要大量工作。为分离的实体创建通用的保存、更新方法确实很“有趣”。

——道格拉斯·H.

You can not use lamba expression (Where clause in the getById method) to retrieve items becuase the properties are not know for type T.

You will have to build a SQL string and execute that.

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

You will have to get the TableName and PrimaryKeyName for type T. You can get the table name using the following:

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

You can get the list of primary key columns using:

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

If you don't mind having each repository inheriate from a base class, you could simple set two fields for TableName and PrimaryKey.

It's alot of work to build a complete generic DAL/Repository for Linq2Sql. It really gets "fun" creating generic Save, Update methods for detached entities.

-Douglas H.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文