Linq-动态构建Linq查询时模拟OrWhere表达式?

Linq-动态构建Linq查询时模拟OrWhere表达式?,linq,Linq,搜索下面的代码段允许用户根据表中的三个字段匹配字符串。如果任何字段匹配,则该条目将包含在结果中。但是,使用Where过滤结果会导致“字符串必须匹配所有三个字段”,而不是“字符串可以匹配三个字段中的任何一个” 在动态构建LINQ查询时,是否有方法模拟OrWhere表达式 var foundUsers = from UserInfo user in entities.UserInfo select user; if (searchCompleteName) {

搜索下面的代码段允许用户根据表中的三个字段匹配字符串。如果任何字段匹配,则该条目将包含在结果中。但是,使用Where过滤结果会导致“字符串必须匹配所有三个字段”,而不是“字符串可以匹配三个字段中的任何一个”

在动态构建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));
}

另外,我正在使用Entities框架和LINQ to Entities,正在做一个MVC3 Web应用程序。

试试这个:-

不太漂亮,但它会工作

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)));
}
var foundUsers=Enumerable.Empty().AsQueryable();
如果(searchCompleteName)
{
foundUsers=foundUsers.Union(entities.UserInfo.Where(u=>u.CompleteName.Contains(searchString));
}
如果(搜索Portalid)
{
foundUsers=foundUsers.Union(entities.UserInfo.Where(u=>u.PortalID.Contains(searchString));
}
如果(搜索用户名)
{
foundUsers=foundUsers.Union(entities.UserInfo.Where(u=>u.PortalID.Contains(searchString));
}
另请参见my,以获取不需要
.AsExpandable()
的替代方案。