如何防止实体框架逃离我的正则表达式?

时间:2009-12-18 16:33:22

标签: sql linq-to-entities escaping

简单地说......在普通的SQL中我会这样做:

SELECT * FROM [Products] WHERE [Description] LIKE '%[0-9]%'

在Linq to Entities中我这样做:

Products.Where(p => p.Description.Contains("[0-9]"))

但我最终得到了这个:

-- Region Parameters
DECLARE @p0 NVarChar(8) SET @p0 = '%~[0-9]%'
-- EndRegion
SELECT ...
FROM [Products] AS [t0]
WHERE [t0].[Description] LIKE @p0 ESCAPE '~'

这逃脱了我对SQL正则表达式的尝试。

任何想法如何绕过这个?

修改

我应该补充说我正在使用实体框架和它的SQL提供程序(是吗?)我正在尝试在IQueryable上完成工作,即在运行之前不必将所有行都带入.NET正则表达式

1 个答案:

答案 0 :(得分:2)

您可以在查询中使用Like:

using System.Data.Linq.SqlClient;
...
var query = from p in Products
            where SqlMethods.Like(p.Description, "%[0-9]%")
            select p;

但是这只适用于LINQ to SQL而不是LINQ to Entities,但是你显示LINQ转换为SQL语句所以我猜你正在使用LINQ to SQL。如果没有,那么只需在Where。

中使用Regex表达式

脱离我的头顶:

RegEx pattern = new RegEx("[0-9]");
...
var query = from p in Products
            where patter.IsMatch(p.Description)
            select p;

我没有测试过这个,但它应该可行。