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

时间:2011-03-25 05:18:50

标签: linq

搜索下方的代码段允许用户将字符串与表格中的三个字段进行匹配。如果任何字段匹配,则条目包含在结果中。但是,使用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));
}

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

2 个答案:

答案 0 :(得分:7)

答案 1 :(得分:3)

不完全漂亮,但它会起作用。

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)));
}