编程语言
首页 > 编程语言> > C#-用于存储库的通用Linq查找方法

C#-用于存储库的通用Linq查找方法

作者:互联网

我有一个使用“存储库”模式的应用程序来抽象如何检索数据.我计划使用Web服务来检索数据,但是在开发过程中将仅对其进行模拟.但是,我对如何使查找方法起作用感到困惑.到目前为止,我有以下内容,但是我不确定query.Compile()是否正确(我发现没有示例可以做到).我收到一个编译器错误,说采用System.Linq.Expressions.Expression的Linq的Where方法没有重载.这是我到目前为止的位置:

public async Task<IEnumerable<Customer>> FindAsync(Expression<Func<Customer, bool>> query)
{
    var allCustomers = await GetAllAsync(true);

    return allCustomers.Where(query.Compile());
}

在某个时候,我想弄清楚如何避免检索所有客户,然后再应用该表达式,但不确定如何将表达式传递给REST Web服务,以便在数据访问层进行过滤.

解决方法:

我见过的Repository模式的实现通常如下所示(使用Entity Framework):

public class Repository<T> where T : class
{
    private readonly DbSet<T> _queryableBase;

    public Repository(DbSet<T> queryableBase)
    {
        _queryableBase = queryableBase;
    }

    public T Select(IFilter<T> filterClass)
    {
        return filterClass.Filter(_queryableBase.AsQueryable()).First();
    }
    public IEnumerable<T> SelectMany(IFilter<T> filterClass)
    {
        return filterClass.Filter(_queryableBase.AsQueryable());
    }

    public void Delete(T item)
    {
        _queryableBase.Remove(item);
    }

    public void Add(T item)
    {
        _queryableBase.Add(item);
    }
}

然后是过滤器对象:

public interface IFilter<T>
{
    IEnumerable<T> Filter(IEnumerable<T> queryableBase);
}

过滤实现示例:

class FilterChris : IFilter<ATestObject>
{
    public IEnumerable<ATestObject> Filter(IEnumerable<ATestObject> queryableBase)
    {
        return queryableBase.Where(o => o.FirstName == "Chris");
    }
}

public class ATestObject
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

请注意,过滤器可以链接.

标签:repository-pattern,linq,c
来源: https://codeday.me/bug/20191121/2050849.html