2011-10-22 152 views
1

如何为以下简单搜索条件编写动态Linq查询? 1)StudentNumber 2)姓氏 3)姓氏和名字动态Linq查询帮助?

//if (!String.IsNullOrEmpty(StudentNumber)) 
var results = (from s in Students    
       where s.StudentNumber == 1001 
       select s 
       ); 

//else if (!String.IsNullOrEmpty(LastName) & (String.IsNullOrEmpty(FirstName)) 

var results = (from s in Students    
       where s.LastName == "Tucker" 
       select s 
       ); 

//else if (!String.IsNullOrEmpty(LastName) & (!String.IsNullOrEmpty(FirstName))    
var results = (from s in Students    
       where s.LastName == "Tucker" && s.FirstName == "Ron" 
       select s 
       ); 
+0

请尝试关注此主题。 http://stackoverflow.com/questions/2827446/linq-dynamic-query 问候。 –

回答

5

需要声明任何个人查询您的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构建的更大,因为这个逻辑包含了全部,它不仅仅是我们有条件添加的逻辑。

+0

有没有一种方法可以先构造WHERE子句并在没有if ... else的情况下在Linq查询中使用它? – rk1962

+0

@ rk1962,你认为如何在不使用某种if/else结构(包括条件语句)的情况下有条件地构建'where'?你可以在EF/SQL的情况下构建一个'Func '(或'Expression >)并将其传递到你的查询中,但这个想法是一样的,它只是当你表达它时*的问题,而不是*如果*。 –

+0

我做了一些研究,并在这里找到了类似的问题:http://stackoverflow.com/questions/798553/user-defined-filter-for-linq。我将阅读动态Linq查询库文章http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx到看看它是否有帮助。谢谢! – rk1962