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