J'ai une grande question.
J'ai une requête linq pour dire que cela ressemble simplement à ceci:
from xx in table
where xx.uid.ToString().Contains(string[])
select xx
Les valeurs du string[]
tableau seraient des nombres comme (1,45,20,10, etc ...)
la valeur par défaut pour .Contains
est .Contains(string)
.
J'en ai besoin pour faire ceci à la place: .Contains(string[])
...
EDIT: Un utilisateur a suggéré d'écrire une classe d'extension pour string[]
. J'aimerais savoir comment, mais quelqu'un veut-il me diriger dans la bonne direction?
EDIT: L'uid serait également un nombre. C'est pourquoi il est converti en chaîne.
Aider quelqu'un?
Réponses:
spoulson l' a presque raison, mais vous devez créer un à
List<string>
partir de lastring[]
première. En fait, ceList<int>
serait mieux si uid l'est égalementint
.List<T>
prend en chargeContains()
. Celauid.ToString().Contains(string[])
impliquerait que l'uid en tant que chaîne contienne toutes les valeurs du tableau en tant que sous-chaîne ??? Même si vous aviez écrit la méthode d'extension, le sens serait faux.[ÉDITER]
À moins que vous ne l'ayez changé et que vous ne l'ayez écrit
string[]
comme le montre Mitch Wheat, vous pourrez simplement ignorer l'étape de conversion.[ENDEDIT]
Voici ce que vous voulez, si vous ne faites pas la méthode d'extension (sauf si vous avez déjà la collection d'uids potentiels comme ints - utilisez simplement à la
List<int>()
place). Cela utilise la syntaxe de la méthode chaînée, que je pense plus propre, et effectue la conversion en int pour garantir que la requête peut être utilisée avec plus de fournisseurs.la source
List<int>
place et ignorer l'ToString
appel.Si vous cherchez vraiment à répliquer Contains , mais pour un tableau, voici une méthode d'extension et un exemple de code à utiliser:
la source
!string.IsNullOrEmpty(str)
vérification réussissait, lavalues.Length > 0
condition étant ignorée, mais que la longueur de Values était égale à 0 , alors elle irait auforeach
, puis se briserait immédiatement car il n'y a pas d'entrées dans le tableau, allant directement aureturn false
.Essayez ce qui suit.
la source
LINQ dans .NET 4.0 a une autre option pour vous; la méthode .Any ();
la source
Any()
et lesAll()
méthodes sont si simples :) Je peux utilisert => words.All(w => t.Title.Contains(w))
.Ou si vous avez déjà les données dans une liste et préférez l'autre format Linq :)
la source
Que diriez-vous:
la source
Ceci est un exemple d'une manière d'écrire une méthode d'extension (note: je ne l'utiliserais pas pour de très grands tableaux; une autre structure de données serait plus appropriée ...):
la source
C'est une réponse tardive, mais je pense qu'elle est toujours utile .
J'ai créé le package nuget NinjaNye.SearchExtension qui peut aider à résoudre ce problème:
Vous pouvez également rechercher plusieurs propriétés de chaîne
Ou effectuez un
RankedSearch
qui renvoieIQueryable<IRanked<T>>
qui inclut simplement une propriété qui montre combien de fois les termes de recherche sont apparus:Il existe un guide plus complet sur la page GitHub des projets: https://github.com/ninjanye/SearchExtensions
J'espère que cela aidera les futurs visiteurs
la source
IQueryable
etIEnumerable
- soyez juste loin que si vous l'enchaînez à partir d'un IEnumerable, il fonctionnera dans la mémoire plutôt que de créer une requête et de l'envoyer à la sourceMéthode d'extension Linq. Fonctionnera avec n'importe quel objet IEnumerable:
Usage:
la source
Je pense que vous pourriez aussi faire quelque chose comme ça.
la source
Alors est-ce que je suppose correctement que uid est un identifiant unique (Guid)? Est-ce juste un exemple d'un scénario possible ou essayez-vous vraiment de trouver un guid qui correspond à un tableau de chaînes?
Si cela est vrai, vous voudrez peut-être vraiment repenser toute cette approche, cela semble être une très mauvaise idée. Vous devriez probablement essayer de faire correspondre un Guid à un Guid
Honnêtement, je ne peux pas imaginer un scénario où faire correspondre un tableau de chaînes en utilisant "contient" au contenu d'un Guid serait une bonne idée. D'une part, Contains () ne garantira pas l'ordre des nombres dans le Guid afin que vous puissiez potentiellement faire correspondre plusieurs éléments. Sans parler de comparer les guides de cette façon serait bien plus lent que de le faire directement.
la source
Vous devriez l'écrire dans l'autre sens, en vérifiant que votre liste d'identifiants d'utilisateurs privilégiés contient l'identifiant sur cette ligne de la table:
LINQ se comporte assez brillamment ici et le convertit en une bonne instruction SQL:
qui intègre fondamentalement le contenu du tableau 'search' dans la requête SQL, et effectue le filtrage avec le mot-clé 'IN' dans SQL.
la source
J'ai réussi à trouver une solution, mais pas excellente car elle nécessite l'utilisation de AsEnumerable () qui va renvoyer tous les résultats de la base de données, heureusement je n'ai que 1k enregistrements dans le tableau, donc ce n'est pas vraiment perceptible, mais voici .
Mon message d'origine suit:
la source
La meilleure solution que j'ai trouvée était d'aller de l'avant et de créer une fonction table en SQL qui produit les résultats, tels que:
Ensuite, vous faites simplement glisser la fonction dans votre concepteur LINQ.dbml et l'appelez comme vous le faites pour vos autres objets. Le LINQ connaît même les colonnes de votre fonction stockée. Je l'appelle comme ceci:
Incroyablement simple et utilise vraiment la puissance de SQL et LINQ dans l'application ... et vous pouvez, bien sûr, générer n'importe quelle fonction de table que vous voulez pour les mêmes effets!
la source
Je crois que ce que vous voulez vraiment faire est: imaginons un scénario vous avez deux bases de données et ils ont une table de produits en commun Et vous voulez sélectionner des produits de la table "A" que l'id a en commun avec le "B"
utiliser la méthode contient serait trop compliqué pour faire cela ce que nous faisons est une intersection, et il existe une méthode appelée intersection pour cela
un exemple de msdn: http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#intersect1
int [] nombres = (0, 2, 4, 5, 6, 8, 9); int [] nombresB = (1, 3, 5, 7, 8); var = commonNumbers nombresA.Intersect (nombresB);
Je pense que ce dont vous avez besoin est facilement résolu avec l'intersection
la source
Vérifiez cette méthode d'extension:
la source
la source
Essayer:
la source
la source
la source
la source
la source