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

C# 使用Linq表达式在通用存储库中实现搜索,c#,linq,entity-framework,C#,Linq,Entity Framework,我首先使用实体框架和代码。这里有一个简单的例子向你展示我的案例 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> Perso

我首先使用实体框架和代码。这里有一个简单的例子向你展示我的案例

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; }
}
公共类人员模型
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串Nachname{get;set;}
}
公共类EfContext:DbContext
{
公共DbSet 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);
}
公共类人物
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串Nachname{get;set;}
}
公共接口IGenericRepository
{
整数计数{get;}
无效添加(T项);
作废删除(T项);
无效更新(T项);
T GetData(int-id);
IEnumerable GetData();
IEnumerable GetData(整数偏移量、整数计数);
IEnumerable Find(表达式谓词);
IEnumerable Find(IEnumerable谓词);
}
Person
PersonEfModel
必须是两种不同的类型,才能完全独立于数据库模型。所以会有一个Person类型的通用存储库,但我真的不知道如何实现Find方法。我只能对依赖于PersonEfModel而不是Person的数据库执行表达式


那么,有没有办法将
表达式
转换为
表达式
来对数据库执行它,还是我走错了路?

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


您只是引入了额外的、完全不必要的复杂性。每次更改
Person
类时,您都需要更改
PersonEfModel
类,要使存储库正常工作,您需要使用某种映射器(AutoMapper)并将
Person
映射到
PersonEfModel
,这是完全不必要的,因为这两个对象很可能是相同的。

您不需要创建两个对象来表示相同的实体。目前,
Person
没有底层数据访问的概念-它已经独立于数据库模型。您实际面临什么问题?你试过什么吗?如果是这样的话,您可以共享一些代码吗?请查看您何时使用EntityFrameworkContext加载一个实体,然后进行一些更改,如Person.Name=“Test”,而下一次在上下文中调用SaveChanges时,Persons的名称为“Test”,因此entity framework将跟踪每个加载实体的更改。实际上我尝试了一些方法(通过表达式树和类似的方法),但没有达到预期效果。好吧,也许你是对的。但是PersonEfModel中存在某种开销。例如,所有ForeignKey属性我不希望它们出现在我的模型中。如果无法在这两种表达式类型之间进行转换,我将接受此答案,谢谢