使用Linq表达式在通用存储库中实现搜索

时间:2013-03-24 14:12:16

标签: c# linq entity-framework

我首先使用Entity Framework和Code。这是一个向我展示案例的简单例子。

public class PersonEfModel
{
    public int Id { get; set; }
    public string Vorname { get; set; }
    public string Nachname { get; set; }
}

public class EfContext : DbContext
{
    public DbSet<Person> Personen { get; set; }
}

独立于数据访问的实现,我用存储库编写了一个抽象层。

public class Person
{
    public int Id { get; set; }
    public string Vorname { get; set; }
    public string Nachname { get; set; }
}

public interface IGenericRepository<T>
{
    int Count { get; }

    void Add(T item);
    void Delete(T item);
    void Update(T item);

    T GetData(int id);
    IEnumerable<T> GetData();
    IEnumerable<T> GetData(int offset, int count);

    IEnumerable<T> Find(Expression<Func<T,bool>> predicate);
    IEnumerable<T> Find(IEnumerable<Expression<Func<T, bool>>> predicates);
}

PersonPersonEfModel必须是两种不同的类型才能完全独立于数据库模型。所以会有一个类型为Person的通用存储库,但我真的不知道如何实现Find方法。我只能对依赖于PersonEfModel而不是Person的数据库执行表达式。

那么有没有办法将Expression<Func<Person, bool>>转换为Expression<Func<PersonEfModel, bool>>来对数据库执行它,或者我是在错误的路径上?

1 个答案:

答案 0 :(得分:1)

如果您真的遵循域驱动设计,那么您不需要创建2个单独的对象来表示Person。您的Person类已经是POCO,它代表您自己代码中所需的确切实体(您使用的是Code First)。

您只是引入额外且完全不必要的复杂性。每次更改Person课程时,您都需要更改PersonEfModel课程并使存储库正常工作,您需要使用某种映射器(AutoMapper)并将Person映射到{ {1}}这完全没必要,因为2很可能是相同的。