2011-03-25 82 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))); 
}