views:

6322

answers:

4

Hello All,

I have a procedure in SQL that I am trying to turn into Linq:

SELECT O.Id, O.Name as Organization
FROM Organizations O
JOIN OrganizationsHierarchy OH ON O.Id=OH.OrganizationsId
where OH.Hierarchy like '%/12/%'

The line I am most concerned with is:

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

I have a column that stores the hierarchy like /1/3/12/ for example so I just use %/12/% to search for it.

My question is, what is the Linq or .NET equivalent to using the percent sign?

Much appreciated,

-Matt

+18  A: 

.Where(oh => oh.Hierarchy.Contains("/12/"))

you can also use .StartsWith() or .EndsWidth()

Andrew Robinson
+8  A: 

I'm assuming you're using Linq-to-SQL* (see note below). If so, use string.Contains, string.StartsWith, and string.EndsWith to generate SQL that use the SQL LIKE operator.

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 }

Note: * = if you are using the ADO.Net Entity Framework (EF / L2E) in .net 3.5, be aware that it will not do the same translation as Linq-to-SQL. Although L2S does a proper translation, L2E v1 (3.5) will translate into a t-sql expression that will force a full table scan on the table you're querying unless there is another better discriminator in your where clause or join filters.
Update: This is fixed in EF/L2E v4 (.net 4.0), so it will generate a SQL LIKE just like L2S does.

KristoferA - Huagati.com
+3  A: 

If you are using VB.NET, then the answer would be "*". Here is what your where clause would look like...

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

Note: "*" Matches zero or more characters. Here is the msdn article for the Like operator.

robertz
Does the VB Like operator translate into L2S calls? (I have no idea.)
Andrew Robinson
Yes, the VB Like operator gets translated to the SQL version of like when used in a LINQ query expression. Also, the VB Like operator is not restricted to query expressions.
robertz
I saw that it existed outside of LINQ operations. Good stuff. +1
Andrew Robinson
+5  A: 

Use this

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