2013-05-29 146 views
0

我正在尝试使用Linq从搜索用户控件中查询数据库。使用linq过滤搜索

我有这个Linq查询用用户的输入搜索数据库。

这是我目前使用的代码:

var query = from invite in db.invites 
      where invite.Division == userInput.Division.Text && 
        invite.Status == userInput.Status.Text 
      select invite; 

我的问题是,如果任何一个是空的,我需要不考虑它的搜索过滤器。有没有办法正确地做到这一点,考虑到我有很多过滤器,而不仅仅是地位和分工?

+1

可能的重复[你如何添加动态'where'条款linq查询?](http://stackoverflow.com/questions/180405/how-do-you-add-dynamic-where-clauses-to -a-linq-query) –

回答

2

感谢延期执行,您可以有条件地构建查询。

var query = db.invites.AsQueryable(); 

if(!string.IsNullOrEmpty(userInput.Division.Text)) 
    query = query.Where(invite => invite.Division == userInput.Division.Text); 

if(!string.IsNullOrEmpty(userInput.Status.Text)) 
    query = query.Where(invite => invite.Status== userInput.Status.Text); 
0
var query = from invite in db.invites 
     where invite.Division.Contains(userInput.Division.Text) && 
       invite.Status.Contains(userInput.Status.Text) 
     select invite; 

var query = from invite in db.invites select invite; 
if (!string.IsNullOrEmpty(userInput.Division.Text)) query = query.Where(invite => invite.Division == userInput.Division.Text); 
if (!string.IsNullOrEmpty(userInput.Division.Text)) query = query.Where(invite => invite.Status == userInput.Status.Text); 
+0

第一个示例的行为与原始行为不一样 –

+0

您的权利尽管关于他的问题的某些内容告诉我他可能正在为该解决方案准备好。 – ikwillem

+0

看起来很有可能 –

1

这应该工作:

var query = from invite in db.invites 
     where invite.Division.Matches(userInput.Division.Text) && 
       invite.Status.Matches(userInput.Status.Text) 
     select invite; 

static class Extensions 
{ 
    public static bool Matches(this string text, string value) 
    { 
     if(string.IsNullOrEmpty(value)) return true; 
     return text == value; // or same safer comparison 
    } 
} 

有更好的方法来建立查询,但这是简单的(Matches需要更好的名字)。

作为@willem笔记,我错过了在数据库上执行查询的可能性(db.invites) - 但是,我在此留下答案,因为它适用于对象查询。