簡體   English   中英

使用Linq表達式在通用存儲庫中實現搜索

[英]Implement searching in a generic repository with Linq Expressions

我首先使用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>>來對數據庫執行它還是我在錯誤的路徑上?

如果您真的遵循域驅動設計,那么您不需要創建2個單獨的對象來表示Person 您的Person類已經是POCO,它代表您自己的代碼中所需的確切實體(您正在使用Code First)。

您只是引入了額外的,完全不必要的復雜性。 每次更改Person類時,您都需要更改PersonEfModel類並使存儲庫正常工作,您需要使用某種映射器(AutoMapper)並將Person映射到PersonEfModel ,這完全沒有必要,因為2很可能是相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM