如何在Linq中使用SQL Like%?

Mat*_*ell 376 .net t-sql linq linq-to-entities sql-like

我在SQL中有一个程序,我试图变成Linq:

SELECT O.Id, O.Name as Organization
FROM Organizations O
JOIN OrganizationsHierarchy OH ON O.Id=OH.OrganizationsId
where OH.Hierarchy like '%/12/%'
Run Code Online (Sandbox Code Playgroud)

我最关心的是:

where OH.Hierarchy like '%/12/%'
Run Code Online (Sandbox Code Playgroud)

我有一个存储层的列,例如/ 1/3/12,所以我只使用%/ 12 /%来搜索它.

我的问题是,Linq或.NET相当于使用百分号?

and*_*eer 536

.Where(oh => oh.Hierarchy.Contains("/12/"))
Run Code Online (Sandbox Code Playgroud)

你也可以使用.StartsWith().EndsWith().

  • 无法理解为什么这不适用于带有字母的用例,然后意识到我的愚蠢......不要忘记`.ToLower().如果你想忽略大小写,请包含()`等.您是否希望这样做当然取决于您是否尝试使用不区分大小写的排序规则来模拟LIKE. (20认同)
  • `StartsWith("abc")`被转换为`LIKE'abc%'`和`EndsWith("abc")`被转换为`LIKE'%abc'` (10认同)
  • 不,StartsWith()和EndsWith()是谓词/过滤器的一部分.执行继续推迟. (5认同)
  • 使用StartsWith()或EndsWith()会触发查询吗?我的意思是,代码是否会被转换为查询,或者从数据库中检索后会在对象中过滤结果? (4认同)
  • 尝试得到NullReferenceException:对象引用未设置为对象的实例.所以它在我的情况下不喜欢a.Address1.StartsWith(Address1)和a.Address1为null (2认同)

小智 246

用这个:

from c in dc.Organization
where SqlMethods.Like(c.Hierarchy, "%/12/%")
select *;
Run Code Online (Sandbox Code Playgroud)

  • 如果您想使用like命令提供的更复杂的模式匹配,这非常有用.例如,如果要检查任何两个数字(而不是12),可以使用以下表达式:SqlMethods.Like(c.Hierarchy,"%/ [0-9] [0-9] /%")另外,请参阅此http://msdn.microsoft.com/en-us/library/aa933232(SQL.80).aspx (22认同)
  • 请注意,您需要包含`System.Data.Linq.SqlClient`命名空间. (12认同)
  • 你如何使用"点符号"使用`SqlMethods`? (8认同)
  • 尽管我可以添加 System.Data.Linq,但我找不到 System.Data.Linq.SqlClient。它已被弃用吗? (3认同)

Kri*_*erA 40

我假设您正在使用Linq-to-SQL*(请参阅下面的注释).如果是这样,请使用string.Contains,string.StartsWith和string.EndsWith生成使用SQL LIKE运算符的SQL.

from o in dc.Organization
join oh in dc.OrganizationsHierarchy on o.Id equals oh.OrganizationsId
where oh.Hierarchy.Contains(@"/12/")
select new { o.Id, o.Name }
Run Code Online (Sandbox Code Playgroud)

要么

from o in dc.Organization
where o.OrganizationsHierarchy.Hierarchy.Contains(@"/12/")
select new { o.Id, o.Name }
Run Code Online (Sandbox Code Playgroud)

注意: *=如果您在.net 3.5中使用ADO.Net实体框架(EF/L2E),请注意它不会执行与Linq-to-SQL相同的转换.尽管L2S执行了正确的转换,但L2E v1(3.5)将转换为t-sql表达式,该表达式将强制对您要查询的表进行全表扫描,除非在where子句或联接过滤器中有另一个更好的鉴别器.
更新:这在EF/L2E v4(.net 4.0)中得到修复,因此它将像L2S一样生成SQL LIKE.


rob*_*rtz 27

如果您使用的是VB.NET,那么答案就是"*".这是你的where子句的样子......

Where OH.Hierarchy Like '*/12/*'
Run Code Online (Sandbox Code Playgroud)

注意:"*"匹配零个或多个字符.这是Like运算符的msdn文章.

  • 是的,当在LINQ查询表达式中使用时,VB Like运算符被转换为类似的SQL版本.此外,VB Like运算符不限于查询表达式. (8认同)

Rum*_*lin 9

那么indexOf也适合我

var result = from c in SampleList
where c.LongName.IndexOf(SearchQuery) >= 0
select c;
Run Code Online (Sandbox Code Playgroud)


kof*_*fus 6

.NET 核心现在有 EF.Functions.Like

  var isMatch = EF.Functions.Like(stringThatMightMatch, pattern);
Run Code Online (Sandbox Code Playgroud)

  • 该答案应包含如何使用此功能的可行示例。 (2认同)

小智 5

使用这样的代码

try
{
    using (DatosDataContext dtc = new DatosDataContext())
    {
        var query = from pe in dtc.Personal_Hgo
                    where SqlMethods.Like(pe.nombre, "%" + txtNombre.Text + "%")
                    select new
                    {
                        pe.numero
                        ,
                        pe.nombre
                    };
        dgvDatos.DataSource = query.ToList();
    }
}
catch (Exception ex)
{
    string mensaje = ex.Message;
}
Run Code Online (Sandbox Code Playgroud)