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

Ext*_*kun 5 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));
}
Run Code Online (Sandbox Code Playgroud)

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

Rya*_*yan 5

不太漂亮,但它会起作用。

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

您也可以通过工会来做到这一点。联合运算符返回不同的结果,因此不会有任何重复。我不知道 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)));
}
Run Code Online (Sandbox Code Playgroud)