存储库中的多个搜索条件

See*_*een 2 asp.net-mvc search entity-framework repository

我有一个关于如何在ASP.net MVC中为存储库模式实现多个条件的问题.想象一下EF4中的POCO课程

public class people
{ String Name {get;set;}
float Height {get;set;}
float Weight {get;set;}
int age {get;set;}
....
}
Run Code Online (Sandbox Code Playgroud)

如果我建立一个存储库IPeopleRepository,我应该为多标准搜索实现什么样的方法(例如Age> 30,Height> 80).这些标准与类中的属性有关,一些输入可能为null.当然我可以写一个像这样的方法

People SearchPeople (int age, float height.....) 

但我必须判断每个变量是否为null并附加到搜索查询中.

那么你对如何在EF中实现这个功能有什么好的想法吗?

RPM*_*984 7

这听起来像是在寻找像规格模式这样的东西.

有涉及EF4/POCO /存储库/规格模式一个伟大的文章在这里.

虽然我喜欢这种模式,但我发现在简单的场景中它有点矫枉过正.

我最终使用了"管道和过滤器"技术 - 基本上是IQueryable<T>对象的扩展方法,使您的存储库代码流畅.

但是对于搜索条件,我很想让消费代码提供谓词,那么你不必担心参数.

所以定义是这样的:

public People SearchPeople(Expression<Func<People,bool>> predicate)
{
   return _context.People.SingleOrDefault(predicate);
}
Run Code Online (Sandbox Code Playgroud)

然后代码只提供谓词.

var person = _repository.SearchPeople(p => p.Age > 30 && p.Height > 80);
Run Code Online (Sandbox Code Playgroud)

有些人不喜欢这种技术,因为它给消费者提供了太多的"力量",因为他们可能提供类似的谓词p.Id > 0并返回数据库中的所有行.

要抵消这种情况,请为maxRows提供可选参数.如果未提供,则默认为100行.