COMME opérateur dans LINQ
Est-il possible de comparer des chaînes de caractères en C#, LINQ expression similaire à SQL LIKE
opérateur?
Supposons que j'ai une liste de chaînes. Sur cette liste, je recherche une chaîne de caractères. En SQL, je pourrais écrire:
SELECT * FROM DischargePort WHERE PortName LIKE '%BALTIMORE%'
Au lieu de ce qui précède, la requête voulez 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;
Mon au-dessus de la syntaxe LINQ ne fonctionne pas. Qu'ai-je eu tort?
- Cette requête essentiellement travaillé pour moi que vous le mettez en place. Mais, je suis en utilisant MongoDb Linq pilote et il y a des différences d'implémentation dans chaque fournisseur Linq ... de toute façon, Merci.
Vous devez vous connecter pour publier un commentaire.
Vous utilisez, généralement
String.StartsWith
/EndsWith
/Contains
. Par exemple:Je ne sais pas si il y a moyen de faire bonne expressions régulières via LINQ to SQL si. (Notez qu'il ne dépend vraiment de quel fournisseur que vous utilisez ce serait bien dans LINQ to Objects; c'est une question de savoir si le fournisseur peut convertir l'appel dans sa requête native format, par exemple SQL.)
EDIT: Comme BitKFu dit,
Single
devrait être utilisé lorsque vous attendez exactement un résultat - quand c'est une erreur que de ne pas être le cas. Options deSingleOrDefault
,FirstOrDefault
ouFirst
doit être utilisé selon exactement ce que l'on attend.Single()
,SingleOrDefault()
serait ma prochaine étape, à moins de comprendre le contexte....StartsWith
. par exemple: DateTime?<
et>
(ou>=
) les opérateurs..ToString()
Regex? pas de. Mais pour cette requête vous pouvez simplement utiliser:
Si vous vraiment voulez SQL
LIKE
, vous pouvez utiliserSystem.Les données.Linq.SqlClient.SqlMethods.Comme(...)
, qui LINQ-to-SQL maps pourLIKE
dans SQL Server.Bien... parfois, il peut être mal à l'aise d'utiliser
Contains
,StartsWith
ouEndsWith
en particulier lors de la recherche de la valeur de déterminerLIKE
de tresorerie par exemple réussi " value%' exiger de la part du développeur d'utiliserStartsWith
fonction dans l'expression. J'ai donc décidé d'écrire une extension pourIQueryable
objets.Utilisation
Code
IEnumerable
?Comme Jon Skeet et Marc Gravel déjà mentionné, vous pouvez simplement prendre un contient une condition. Mais dans le cas de votre requête, il est très dangereux de prendre un Seul (), parce que cela implique que vous ne trouvez 1 résultat. En cas de résultats, vous recevrez une belle exception 🙂
Donc je préfère utiliser FirstOrDefault() au lieu d'une Seule():
En natif LINQ, vous pouvez utiliser la combinaison de
Contains/StartsWith/EndsWith
ou RegExp.Dans LINQ2SQL utiliser la méthode
SqlMethods.Like()
ajouter Assembly: System.Les données.Linq (en System.Data.Linq.dll pour utiliser cette fonctionnalité.
Un simple que cela
Result -> Annick,Yannick
Vous pouvez appeler la méthode unique avec un prédicat:
Cela fonctionne comme le "LIKE" de SQL...
Idéalement, vous devriez utiliser
StartWith
ouEndWith
.Voici un exemple:
Vient de s'ajouter à la chaîne de l'objet de l'extension des méthodes.
utilisation: