¿Cómo hacer SQL Like% en Linq?

Tengo un procedimiento en SQL que bash convertir en Linq:

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

La línea que más me preocupa es:

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

Tengo una columna que almacena la jerarquía como / 1/3/12 / por ejemplo, así que solo uso% / 12 /% para buscarla.

Mi pregunta es, ¿cuál es el equivalente de Linq o .NET al uso del signo de porcentaje?

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

También puede usar .StartsWith() o .EndsWith() .

Utilizar esta:

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

Supongo que está utilizando Linq-to-SQL * (ver nota a continuación). Si es así, use string.Contains, string.StartsWith y string.EndsWith para generar SQL que use el operador SQL LIKE.

 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 } 

o

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

Nota: * = si está utilizando ADO.Net Entity Framework (EF / L2E) en .net 3.5, tenga en cuenta que no realizará la misma traducción que Linq-to-SQL. Aunque L2S realiza una traducción adecuada, L2E v1 (3.5) se traducirá en una expresión t-sql que forzará una exploración de tabla completa en la tabla que está consultando a menos que haya otro discriminador mejor en su cláusula where o filtros de combinación.
Actualización: Esto se soluciona en EF / L2E v4 (.net 4.0), por lo que generará un SQL LIKE igual que L2S.

Si está utilizando VB.NET, la respuesta sería “*”. Aquí está cómo se vería tu cláusula where …

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

Nota: “*” Coincide con cero o más caracteres. Aquí está el artículo msdn para el operador Like .

En caso de que lo necesite en LINQ to Entities, aquí está cómo: http://jendaperl.blogspot.com/2011/02/like-in-linq-to-entities.html

Well indexOf también funciona para mí

 var result = from c in SampleList where c.LongName.IndexOf(SearchQuery) >= 0 select c; 

Usa ese código

 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; } 

En caso de que no coincida con cadenas numéricas, siempre es bueno tener un caso común:

 .Where(oh => oh.Hierarchy.ToUpper().Contains(mySearchString.ToUpper())) 

El uso del generador de predicados para realizar consultas de Linq es una buena práctica al crear consultas dinámicas con muchas de esas condiciones. Ver este artículo del proyecto de código también

Prueba esto, esto funciona bien para mí

 from record in context.Organization where record.Hierarchy.Contains(12) select record; 

Siempre hago esto

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

Sé que no uso la statement similar, pero funciona bien en el fondo, esto se traduce en una consulta con una statement similar.

Contiene se usa en Linq, al igual que Like se usa en SQL.

 string _search="/12/"; 

. . .

 .Where(s => s.Hierarchy.Contains(_search)) 

Puede escribir su script SQL en Linq como sigue:

  var result= Organizations.Join(OrganizationsHierarchy.Where(s=>s.Hierarchy.Contains("/12/")),s=>s.Id,s=>s.OrganizationsId,(org,orgH)=>new {org,orgH}); 

Para aquellos que se mueven como yo buscando un método “SQL Like” en LINQ, tengo algo que funciona muy bien.

Estoy en un caso donde no puedo alterar la base de datos de ninguna manera para cambiar la intercalación de columnas. Así que tengo que encontrar una forma en mi LINQ para hacerlo.

Estoy usando el método de ayuda SqlFunctions.PatIndex que funciona de forma similar al operador SQL LIKE real.

Primero necesito enumerar todos los diacríticos posibles (una palabra que acabo de aprender) en el valor de búsqueda para obtener algo como:

 déjà => d[éèêëeÉÈÊËE]j[aàâäAÀÂÄ] montreal => montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l montréal => montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l 

y luego en LINQ por ejemplo:

 var city = "montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l"; var data = (from loc in _context.Locations where SqlFunctions.PatIndex(city, loc.City) > 0 select loc.City).ToList(); 

Entonces, para mis necesidades, he escrito un método de Ayuda / Extensión

  public static class SqlServerHelper { private static readonly List> Diacritics = new List>() { new KeyValuePair("A", "aàâäAÀÂÄ"), new KeyValuePair("E", "éèêëeÉÈÊËE"), new KeyValuePair("U", "uûüùUÛÜÙ"), new KeyValuePair("C", "cçCÇ"), new KeyValuePair("I", "iîïIÎÏ"), new KeyValuePair("O", "ôöÔÖ"), new KeyValuePair("Y", "YŸÝýyÿ") }; public static string EnumarateDiacritics(this string stringToDiatritics) { if (string.IsNullOrEmpty(stringToDiatritics.Trim())) return stringToDiatritics; var diacriticChecked = string.Empty; foreach (var c in stringToDiatritics.ToCharArray()) { var diac = Diacritics.FirstOrDefault(o => o.Value.ToCharArray().Contains(c)); if (string.IsNullOrEmpty(diac.Key)) continue; //Prevent from doing same letter/Diacritic more than one time if (diacriticChecked.Contains(diac.Key)) continue; diacriticChecked += diac.Key; stringToDiatritics = stringToDiatritics.Replace(c.ToString(), "[" + diac.Value + "]"); } stringToDiatritics = "%" + stringToDiatritics + "%"; return stringToDiatritics; } } 

Si alguno de ustedes tiene la sugerencia de mejorar este método, me agradaría escucharlo.