Existe-t-il un moyen de comparer des chaînes dans une expression C # LINQ similaire à l' LIKE
opérateur SQL ?
Supposons que j'ai une liste de chaînes. Sur cette liste, je veux rechercher une chaîne. En SQL, je pourrais écrire:
SELECT * FROM DischargePort WHERE PortName LIKE '%BALTIMORE%'
Au lieu de ce qui précède, la requête veut une syntaxe linq.
using System.Text.RegularExpressions;
…
var regex = new Regex(sDischargePort, RegexOptions.IgnoreCase);
var sPortCode = Database.DischargePorts
.Where(p => regex.IsMatch(p.PortName))
.Single().PortCode;
Ma syntaxe LINQ ci-dessus ne fonctionne pas. Qu'est-ce que je me trompe?
Réponses:
Généralement, vous utilisez
String.StartsWith
/EndsWith
/Contains
. Par exemple:Je ne sais pas s'il existe un moyen de créer des expressions régulières appropriées via LINQ to SQL. (Notez que cela dépend vraiment du fournisseur que vous utilisez - ce serait bien dans LINQ to Objects; il s'agit de savoir si le fournisseur peut convertir l'appel dans son format de requête natif, par exemple SQL.)
EDIT: Comme le dit BitKFu,
Single
doit être utilisé lorsque vous attendez exactement un résultat - quand c'est une erreur pour que ce ne soit pas le cas. Les options deSingleOrDefault
,FirstOrDefault
ouFirst
doivent être utilisées en fonction exactement de ce qui est attendu.la source
Single()
,SingleOrDefault()
serait ma prochaine étape, à moins que nous ne comprenions le contexte complet ...Regex? non. Mais pour cette requête, vous pouvez simplement utiliser:
Si vous voulez vraiment SQL
LIKE
, vous pouvez utiliserSystem.Data.Linq.SqlClient.SqlMethods.Like(...)
, auquel LINQ-to-SQL mappeLIKE
dans SQL Server.la source
Eh bien ... parfois, il peut être inconfortable à utiliser
Contains
,StartsWith
ou enEndsWith
particulier lors de la recherche de valeur, déterminer laLIKE
déclaration, par exemple, "valeur%" passé, nécessite du développeur d'utiliser laStartsWith
fonction dans l'expression. J'ai donc décidé d'écrire une extension pour lesIQueryable
objets.Usage
Code
la source
IEnumerable
?Comme Jon Skeet et Marc Gravell l'ont déjà mentionné, vous pouvez simplement prendre une condition contient. Mais dans le cas de votre requête similaire, il est très dangereux de prendre une instruction Single (), car cela implique que vous ne trouvez qu'un seul résultat. En cas de plus de résultats, vous recevrez une belle exception :)
Je préférerais donc utiliser FirstOrDefault () au lieu de Single ():
la source
Dans LINQ natif, vous pouvez utiliser une combinaison de
Contains/StartsWith/EndsWith
ou RegExp.Dans LINQ2SQL, utilisez la méthode
SqlMethods.Like()
ajoutez Assembly: System.Data.Linq (dans System.Data.Linq.dll) pour utiliser cette fonctionnalité.
la source
StartsWith()
,Contains()
etc., ne fonctionne pas avec Linq2SQL (au moins j'obtiens "L'expression LINQ ... n'a pas pu être traduite ..." et une instruction pour utiliser ToList () pour "l'évaluation du client" - ce que je ' Je le fais déjà. Notez que dans EF Core, il est déplacé versEF.Functions.Like()
Cela fonctionne comme "LIKE" de SQL ...
la source
Un simple comme ça
Résultat -> Annick, Yannick
la source
Vous pouvez appeler la méthode unique avec un prédicat:
la source
Idéalement, vous devriez utiliser
StartWith
ouEndWith
.Voici un exemple:
la source
la source
Ajoutez simplement aux méthodes d'extension d'objet de chaîne.
usage:
la source
la source
@adobrzyc avait cette excellente
LIKE
fonction personnalisée - je voulais juste en partager laIEnumerable
version.la source