Boo*_*oks 8 c# design-patterns
我经常看到示例存储库模式,如下所示:
public interface IRepository<T>
{
T GetById(int id);
IEnumerable<T> GetAllByName(string name);
}
Run Code Online (Sandbox Code Playgroud)
但是,您如何处理可能需要进行复杂搜索的案例?我不认为向界面添加许多方法会使它最终看起来像是一个好主意:
IEnumerable<T> GetAllByFirstName(string name);
IEnumerable<T> GetAllByLastName(string name);
IEnumerable<T> GetAllByFirstAndLastName(string name);
IEnumerable<T> GetAllByAddress(string name);
...
...
...
Run Code Online (Sandbox Code Playgroud)
使用Predicate Builder动态构建where条件
public interface IRepository<T>
{
T GetById(int id);
IEnumerable<T> GetAllBy(Expression<Func<T, bool>> predicate);
}
Run Code Online (Sandbox Code Playgroud)
然后建立条件
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);
Run Code Online (Sandbox Code Playgroud)
创建一个类来传递搜索条件
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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2178 次 |
| 最近记录: |