gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:54:53 26 4
gpt4 key购买 nike

我首先使用实体​​框架和代码。这是向您展示我的案例的一个简单示例。

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>>对数据库执行它还是我在错误的路径上?

最佳答案

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

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

关于c# - 使用 Linq 表达式在通用存储库中实现搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15599494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com