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