2011-03-25 84 views
4

搜索下面的代码片段允许用户匹配表中的三个字段的字符串。如果任何字段匹配,则该条目包含在结果中。但是,使用Where筛选结果会导致“字符串必须匹配所有三个字段”,而不是“该字符串可以匹配任何三个字段”。Linq - 动态构建LINQ查询时模拟OrWhere表达式?

动态构建LINQ查询时是否有方法模拟OrWhere表达式?

var foundUsers = from UserInfo user in entities.UserInfo 
       select user; 

if (searchCompleteName) 
{ 
    foundUsers = foundUsers.Where(u => u.CompleteName.Contains(searchString)); 
} 

if (searchPortalID) 
{ 
    foundUsers = foundUsers.Where(u => u.PortalID.Contains(searchString)); 
} 

if (searchUsername) 
{ 
    foundUsers = foundUsers.Where(u => u.UserIdentity.Contains(searchString)); 
} 

PS。我正在使用实体框架和LINQ to Entities,并且正在做一个MVC3 Web应用程序。

回答

2

不完全是漂亮,但它会工作。

var foundUsers = entities.UserInfo.Where(u => 
    (searchCompleteName && u.CompleteName.Contains(searchString)) 
    || (searchPortalID && u.PortalID.Contains(searchString)) 
    || (searchUsername && u.UserIdentity.Contains(searchString)); 

你也可以用union来做到这一点。联合运算符返回不同的结果,因此不会有任何重复。我不知道EF是否可以推迟到数据库。

var foundUsers = Enumerable.Empty<UserInfo>().AsQueryable(); 

if (searchCompleteName) 
{ 
    foundUsers = foundUsers.Union(entities.UserInfo.Where(u => u.CompleteName.Contains(searchString))); 
} 

if (searchPortalID) 
{ 
    foundUsers = foundUsers.Union(entities.UserInfo.Where(u => u.PortalID.Contains(searchString))); 
} 

if (searchUsername) 
{ 
    foundUsers = foundUsers.Union(entities.UserInfo.Where(u => u.PortalID.Contains(searchString))); 
}