问题 使用Lambda Expression检查String值是否包含任何数字


我有一个 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);


1479
2018-03-23 12:35


起源

看这个 stackoverflow.com/questions/3513319/... - Venki
@Venki我已经知道了,但我需要一个[0-9]的解决方案。请仔细阅读我的问题! - Clint Eastwood
需要ToList()为json数据请再次回答@binary - Alper Tunga Arslan
请不要在问题本身内发布答案,而是发布新答案。 - Paul Stenne


答案:


据我所知,你不能在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

5
2018-03-23 13:02



不幸的是,他们都没有返回任何记录(即使其他记录)。无论如何,你知道如何在这种情况下使用sql查询对应我上面的lambda表达式(我添加了更新)?任何想法? - Clint Eastwood
嗨@binary,检查我的更新 - octavioccl
非常感谢您的帮助。我还在上面的问题中发布了我的方法的最终状态,以便其他人也可以使用它。问候... - Clint Eastwood
别客气。很高兴我能帮上忙 ;) - octavioccl


EF在生成所需SQL的能力方面受到限制。我不知道将生成模式的特定表达式 [0-9] 在你的 LIKE 条款。

清单 字符串函数  MS支持的是EF支持的。其中任何一个都不能用于确定字符串是否包含任意数字。

其他一些选择是:

  • 使用 精确 你想在C#中调用SQL并调用 ExecuteStoreCommand
  • 从数据库中返回比您需要的更多的对象并使用内存中的过滤器 AsEnumerable()

等效SQL就像是

SELECT *
FROM TEmployees
WHERE Status = {code for active status}
  AND Name NOT LIKE '%[0-9]%'

2
2018-03-23 13:05



在这种情况下,我认为在EF中使用SQL Query是最好的主意。你能否澄清我如何将上面的lambda表达式(在更新中)转换为EF中的SQL查询? - Clint Eastwood


试试这个更多信息 链接 :

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()


2
2018-03-23 12:48



谢谢,我也看了那个页面,但没有奏效。任何想法? - Clint Eastwood
什么是错误? @binary - Alper Tunga Arslan
EF不支持表达式 char.IsDigit - D Stanley
最后一个添加AsEnumarable()并再次尝试请检查我的编辑@binary - Alper Tunga Arslan
需要注意的是,这不会在SQL中执行过滤器。它将返回数据库中的所有行,然后对其进行过滤。 - Nathan Koop


您可以使用 Regex.IsMatch

yourEnumerable.Where(m => !Regex.IsMatch(m.EmployeeName, @"\d"));

1
2018-03-23 12:42



其实我也试过使用!正则表达式,但在这种情况下没有记录返回。任何想法? - Clint Eastwood
请尝试使用此模式^ [0-9] * $ - Bon Macalindong
谢谢,但没有检索任何记录。任何想法? - Clint Eastwood
我模拟了这个,这种模式起作用了@“\ d”。我的测试数据是 sss213, ggg, g1g, 1gg, xxx。它只返回“ggg”和“xxx” - Bon Macalindong
我再次测试但没有返回任何数据。你能看一下上面在更新中显示的lambda表达式吗? - Clint Eastwood


没有一般性的 LINQ to Entities 解。

但是,如果你的目标 只要 Sql Server数据库,可以使用 SqlFunctions.PatIndex 像这样的规范函数:

db.TEmployees
    .Where(m => m.Status == Enums.Status.Active &&
        SqlFunctions.PatIndex("%[0-9]%", m.EmployeeName) == 0)
//...

1
2018-03-23 13:37



谢谢你的回复,但没有使用lambda我也可以使用SQL查询,我解决了它的问题。投票+ - Clint Eastwood


我能想到的唯一使用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。


1
2018-03-23 13:16



是的,我同意你的看法。所以,我认为在EF中使用SQL Query最好。你能否澄清我如何将上面的lambda表达式(在更新中)转换为EF中的SQL查询?谢谢... - Clint Eastwood