我在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/%'

我最关心的一行是:

where OH.Hierarchy like '%/12/%'

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

我的问题是,Linq或。net中使用百分号的等价是什么?


当前回答

用这个:

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

其他回答

我总是这样做:

from h in OH
where h.Hierarchy.Contains("/12/")
select h

我知道我不使用like语句,但它在后台工作很好,这是翻译成一个查询与like语句。

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

  var isMatch = EF.Functions.Like(stringThatMightMatch, pattern);
System.Data.Linq.SqlClient.SqlMethods.Like("mystring", "%string")

如果你使用VB。NET,那么答案将是“*”。这是你的where从句的样子…

Where OH.Hierarchy Like '*/12/*'

备注:“*”匹配零个或多个字符。下面是关于Like操作符的msdn文章。

我假设您正在使用Linq-to-SQL*(参见下面的注释)。如果是,使用字符串。包含字符串。StartsWith和字符串。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 }

or

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

注意:* =如果您正在使用ADO。Net实体框架(EF / L2E),注意它不会像Linq-to-SQL那样进行相同的转换。尽管L2S进行了适当的转换,但L2E v1(3.5)将转换为一个t-sql表达式,该表达式将强制对您正在查询的表进行全表扫描,除非在where子句或连接筛选器中有其他更好的鉴别器。 更新:在EF/L2E v4 (.net 4.0)中修正了这个问题,所以它会像L2S一样生成一个SQL LIKE。