我有一个 SQL
查询只检索不包含任何数字的名称:
...
WHERE Name NOT LIKE '%[0-9]%'
另一方面,在尝试使用此查询时 Lambda Expression
如下所示的不同组合,它们都不起作用不起作用:
.Where(m => !m.EmployeeName.Contains("%[0-9]%")
要么
.Where(m => !m.EmployeeName.Contains(".*[0-9].*")
我该怎么用 NOT LIKE
方法 Lambda Expression
?
更新: 我的lambda表达式如下所示:
return Json(db.TEmployees
.Where(m => m.Status == Enums.Status.Active)
.AsEnumerable()
.Where(m => !Regex.IsMatch(m.EmployeeName, ".*[0-9].*"))
.Select(m => new { ID = m.EmployeeID, EmployeeName = m.EmployeeName }),
JsonRequestBehavior.AllowGet);
据我所知,你不能在Linq中将正则表达式应用于实体。我建议你做的是如果你有其他条件的话 Where
首先使用它们的方法,然后调用 AsEnumerable
使用Linq to Object允许你使用正则表达式,这样你就可以应用你需要的条件:
var query= context.YourDbSet.Where(...)
.AsEnumerable()
.Where(m => !Regex.IsMatch(m.EmployeeName, @"\d"));
或者您也可以执行以下操作:
var query= context.YourDbSet.Where(...)
.AsEnumerable()
.Where(e=>e.!EmployeeName.Any(char.IsDigit));
更新:
第三种解决方案可能正在使用 DbSet.SqlQuery 执行原始SQL查询的方法:
var query= context.YourDbSet.SqlQuery("SELECT * FROM Table WHERE Name NOT LIKE '%[0-9]%'");
将其转换为您的方案将是:
// This column names must match with
// the property names in your entity, otherwise use *
return Json(db.TEmployees.SqlQuery("SELECT EmployeeID,EmployeeName
FROM Employees
WHERE Status=1 AND Name NOT LIKE '%[0-9]%'"),
JsonRequestBehavior.AllowGet);// Change the value in the first condition for the real int value that represents active employees
EF在生成所需SQL的能力方面受到限制。我不知道将生成模式的特定表达式 [0-9]
在你的 LIKE
条款。
清单 字符串函数
MS支持的是EF支持的。其中任何一个都不能用于确定字符串是否包含任意数字。
其他一些选择是:
等效SQL就像是
SELECT *
FROM TEmployees
WHERE Status = {code for active status}
AND Name NOT LIKE '%[0-9]%'
试试这个更多信息 链接 :
return Json(db.TEmployees
.Where(m => m.Status == Enums.Status.Active && !m.EmployeeName.Any(char.IsDigit))
.Select(m => new { ID = m.EmployeeID, EmployeeName = m.EmployeeName }).ToList(),
JsonRequestBehavior.AllowGet);
编辑: 在返回json中添加ToList()
您可以使用 Regex.IsMatch
。
yourEnumerable.Where(m => !Regex.IsMatch(m.EmployeeName, @"\d"));
没有一般性的 LINQ to Entities 解。
但是,如果你的目标 只要 Sql Server数据库,可以使用 SqlFunctions.PatIndex 像这样的规范函数:
db.TEmployees
.Where(m => m.Status == Enums.Status.Active &&
SqlFunctions.PatIndex("%[0-9]%", m.EmployeeName) == 0)
//...
我能想到的唯一使用Linq-To-Entities的解决方案是定义一个字符串数组,看看你的字符串是否包含其中任何一个:
string[] digits = new { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
...Where(m => !digits.Any(m.EmployeeName.Contains(d));
我可以想象,对于大数据集,这将是一个缓慢的查询,所以我只是通过EF执行sql。