0

我试图想出一种通用的方法来通过我的存储库中的 Id 拉取一个对象。在我的数据库中,通常所有的 ID 都是主键并且是整数类型。可能有一种情况,在这种情况下不正确,但我仍然想为所有对象保持相同的方法。这是我的界面现在的样子:

public interface IRepository<TE>
    {
        void Add(TE entity);
        void AddOrAttach(TE entity);
        void DeleteRelatedEntries(TE entity);
        void DeleteRelatedEntries(TE entity, ObservableCollection<string> keyListOfIgnoreEntites);
        void Delete(TE entity);
        int Save();

        //this is where I am stuck
        TE GetById();

    }

我已经看到了一些代码,其中使用反射来获取对象的 ID,然后解析该特定对象的所有对象(不理想)。我也看到过这样的事情:

TE GetById(Expression<Func<TE, bool>> predicate);

我从这里得到了这个想法。

我还不太熟悉表达式,不确定这是否适合我。我想它会,因为我可以包含这个表达式:

var foo = GetById(f => f.Id == 1);

但我想这不是真正的 GetById,而是我可以使用任何表达式来获得我想要的,对吧?

任何想法都会受到赞赏。

4

3 回答 3

2

首先,为什么它是 aRepository<TE,TC>而不是 a Repository<T>

我使用两种方法:

 TE GetById(int id){`
     return _querySource.Single(x=>x.Id ==1);
 }

 IQueryable<TE> Query(Expression<Func<TE,bool>> predicate){
    return _querySource.Where(predicate);
 }

(我假设您有一个基础字段,我为此示例IQueryable<TE>命名了它。)_querySource

于 2011-03-12T14:00:13.593 回答
2

我一般只有:

public interface IRepository<T>
{
    ...
    T Load(object id);
}

我更愿意int对所有主键使用相同的类型 ( ) 进行标准化,但如果这不可能,我会使用object并避免增加第二个泛型参数的复杂性。

于 2011-03-12T14:46:38.490 回答
-1

因为 TE 是一个通用类,所以你不能这样做。

您必须限制此 TE 泛型以实现具有名为 [Id] 的属性的接口

interface MainInterface
{
    Int ID{get;}
}

and in Reporsitory  :
public interface IRepository<TE, TC>  : where TE is MainInterface
    {
        void Add(TE entity);
        void AddOrAttach(TE entity);
        void DeleteRelatedEntries(TE entity);
        void DeleteRelatedEntries(TE entity, ObservableCollection<string> keyListOfIgnoreEntites);
        void Delete(TE entity);
        int Save();

        //this is where I am stuck
        TE GetById();

    }
于 2011-03-12T14:05:59.883 回答