Comment faire du SQL Comme% dans Linq?

J’ai une procédure en SQL que je tente de transformer 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 ligne qui me préoccupe le plus est:

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

J’ai une colonne qui stocke la hiérarchie comme / 1/3/12 / par exemple, donc j’utilise simplement% / 12 /% pour le rechercher.

Ma question est la suivante: quel est l’équivalent de Linq ou .NET en utilisant le signe de pourcentage?

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

Vous pouvez également utiliser .StartsWith() ou .EndsWith() .

Utilisez ceci:

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

Je suppose que vous utilisez Linq-to-SQL * (voir note ci-dessous). Si c’est le cas, utilisez ssortingng.Contains, ssortingng.StartsWith et ssortingng.EndsWith pour générer le code SQL qui utilise l’opérateur 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 } 

ou

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

Remarque: * = Si vous utilisez le framework d’entité ADO.Net (EF / L2E) dans .net 3.5, sachez qu’il ne fera pas la même traduction que Linq-to-SQL. Bien que L2S effectue une traduction correcte, L2E v1 (3.5) se traduira par une expression t-sql qui forcera une parsing de table complète sur la table que vous interrogez, sauf s’il existe un autre discriminant dans votre clause where ou les filtres de jointure.
Mise à jour: Ceci est corrigé dans EF / L2E v4 (.net 4.0), il va donc générer un SQL LIKE comme le fait L2S.

Si vous utilisez VB.NET, la réponse serait “*”. Voici à quoi ressemblerait votre clause where …

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

Note: “*” Correspond à zéro ou plusieurs caractères. Voici l’article msdn pour l’opérateur Like .

Si vous en aviez besoin dans LINQ to Entities, voici comment: http://jendaperl.blogspot.com/2011/02/like-in-linq-to-entities.html

Bien indexOf travaille pour moi aussi

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

Utiliser un tel code

 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) { ssortingng mensaje = ex.Message; } 

Si vous ne correspondez pas à des chaînes numériques, il est toujours bon d’avoir des cas communs:

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

Utiliser le générateur de prédicats pour créer des requêtes Linq est une bonne pratique lors de la création de requêtes dynamics avec beaucoup de ces conditions. Voir aussi cet article codeproject

Essayez ceci, cela fonctionne bien pour moi

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

Je fais toujours ça:

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

Je sais que je n’utilise pas l’instruction like, mais ça marche bien en arrière-plan, cela se traduit par une requête avec une déclaration similaire.

Contient est utilisé dans Linq, tout comme Like est utilisé dans SQL.

 ssortingng _search="/12/"; 

. . .

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

Vous pouvez écrire votre script SQL dans Linq comme suit:

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

Pour ceux qui ont eu un peu de mal comme moi à chercher une méthode “SQL Like” dans LINQ, j’ai trouvé quelque chose qui fonctionne très bien.

Je suis dans un cas où je ne peux pas modifier la firebase database de quelque manière que ce soit pour modifier le classement des colonnes. Donc, je dois trouver un moyen dans mon LINQ pour le faire.

J’utilise la méthode auxiliaire SqlFunctions.PatIndex qui agit de manière similaire à l’opérateur SQL réel LIKE.

D’abord, j’ai besoin d’énumérer tous les diacritiques possibles (un mot que je viens d’apprendre) dans la valeur de recherche pour obtenir quelque chose comme:

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

et ensuite dans LINQ par exemple:

 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(); 

Donc, pour mes besoins, j’ai écrit une méthode d’assistance / extension

  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 ssortingng EnumarateDiacritics(this ssortingng ssortingngToDiasortingtics) { if (ssortingng.IsNullOrEmpty(ssortingngToDiasortingtics.Trim())) return ssortingngToDiasortingtics; var diacriticChecked = ssortingng.Empty; foreach (var c in ssortingngToDiasortingtics.ToCharArray()) { var diac = Diacritics.FirstOrDefault(o => o.Value.ToCharArray().Contains(c)); if (ssortingng.IsNullOrEmpty(diac.Key)) continue; //Prevent from doing same letter/Diacritic more than one time if (diacriticChecked.Contains(diac.Key)) continue; diacriticChecked += diac.Key; ssortingngToDiasortingtics = ssortingngToDiasortingtics.Replace(c.ToSsortingng(), "[" + diac.Value + "]"); } ssortingngToDiasortingtics = "%" + ssortingngToDiasortingtics + "%"; return ssortingngToDiasortingtics; } } 

Si l’un de vous a des suggestions pour améliorer cette méthode, je serai ravi de vous entendre.