我经常看到示例存储库模式,如下所示:
public interface IRepository<T>
{
T GetById(int id);
IEnumerable<T> GetAllByName(string name);
}
但是,如何处理可能需要进行复杂搜索的情况?我认为向接口(interface)添加许多方法使其最终看起来不是一个好主意:
IEnumerable<T> GetAllByFirstName(string name);
IEnumerable<T> GetAllByLastName(string name);
IEnumerable<T> GetAllByFirstAndLastName(string name);
IEnumerable<T> GetAllByAddress(string name);
...
...
...
最佳答案
使用Predicate Builder动态构建where条件
public interface IRepository<T>
{
T GetById(int id);
IEnumerable<T> GetAllBy(Expression<Func<T, bool>> predicate);
}
然后建立条件
var predicate = PredicateBuilder.True<Customer>();
if (!string.IsNullOrEmpty(FirstName))
{
predicate = predicate.And(d => d.FirstName.Contains(FirstName));
}
if (!string.IsNullOrEmpty(LastName))
{
predicate = predicate.And(d => d.LastName.Contains(LastName));
}
var products = productRepo.GetAllBy(predicate);
创建一个类以通过搜索条件
public class CustomerFilterCriteria
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
}
public interface IRepository<T>
{
T GetById(int id);
IEnumerable<T> GetAllBy(CustomerFilterCriteria criteria);
}
关于c# - 储存库模式-太多方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9273622/