需要声明任何个人查询您的results
变量之外。这将允许您根据不同的标准附加不同的过滤器,并根据需要添加尽可能多的过滤器。一个例子:
var results = Students.AsEnumerable(); // use .AsQueryable() for EF or Linq-to-SQL
if (!string.IsNullorEmpty(StudentNumber))
{
results = results.Where(s => s.StudentNumber.Equals(StudentNumber));
}
else if (!string.IsNullOrEmpty(LastName))
{
results = results.Where(s => s.LastName.Equals(LastName));
if (!string.IsNullOrEmpty(FirstName))
{
results = results.Where(s => s.FirstName.Equals(FirstName));
// filter is in addition to predicate against LastName
}
}
// results can be used here
如果处理的LINQ到实体或-SQL,与Students.AsQueryable();
键入初始查询,从而过滤发生在数据库,而不是在应用程序内。
有没有一种方法,我可以先构建WHERE子句,并用它在 Linq查询,而不IF ... ELSE
如果你想建立之前,整个where
查询的第一步,这是相同的逻辑。你有条件地构建谓词,所以你会有某种if/else参与。但是,要首先构建整个谓词,可以针对Linq to Objects构建一个Func<Student, bool>
。
Func<Student, bool> predicate;
if (!string.IsNullOrEmpty(StudentNumber))
{
predicate = s => s.StudentNumber.Equals(StudentNumber);
}
else if (!string.IsNullOrEmpty(LastName))
{
predicate = s => s.LastName.Equals(LastName);
if (!string.IsNullOrEmpty(FirstName))
{
Func<Student, bool> p = predicate;
predicate = s => p(s) && s.FirstName.Equals(FirstName);
}
}
else
{
predicate = s => true;
}
var query = Students.Where(predicate);
您会注意到它与if/else结构完全相同。你可以把它折叠成一个复杂的条件表达式
Func<Student, bool> predicate;
predicate = s =>
!string.IsNullOrEmpty(StudentNumber)
? s.StudentNumber.Equals(StudentNumber)
: !string.IsNullOrEmpty(LastName)
? !string.IsNullOrEmpty(FirstName)
? s.LastName.Equals(LastName) && s.FirstName.Equals(FirstName)
: s.LastName.Equals(LastName)
: true;
var query = Students.Where(predicate);
但是我觉得很难跟得上,当然和if/else的时间长了一样。这个谓词也比我们通过if/else构建的更大,因为这个逻辑包含了全部,它不仅仅是我们有条件添加的逻辑。
请尝试关注此主题。 http://stackoverflow.com/questions/2827446/linq-dynamic-query 问候。 –