SQL COMME dans Linq
Avant l'ajout de cette question, j'ai fait une recherche sur stackoverflow pour ses semblables, mais je ne pourrais pas le trouver. La plupart des questions sur internet ont été en utilisant COMME avec une chaîne de caractères (par exemple LIKE '%ABC%') mais j'ai besoin de comparer avec une colonne d'une autre table.
J'ai besoin d'écrire une requête linq pour l'instruction select, comme ci-dessous -
select *
from [dbo].[BaseClaim]
where WPId like (select WPId from UserProfiles where ID='1459')
Je suis venu avec ci-dessous requête linq mais sa ne fonctionne pas comme prévu -
var result = (from claimsRow in context.BaseClaims
where (from upRow in context.UserProfiles
where upRow.ID == 1459
select upRow.WPId).Contains(claimsRow.WPId)
select claimsRow);
et la requête sql ci-dessus linq génère est comme suit -
SELECT
[Extent1].[WPId] AS [WPId]
FROM [dbo].[BaseClaim] AS [Extent1]
WHERE EXISTS (SELECT
1 AS [C1]
FROM (SELECT
[UserProfiles].[ID] AS [ID],
[UserProfiles].[WPId] AS [WPId]
FROM [dbo].[UserProfiles] AS [UserProfiles]) AS [Extent2]
WHERE (1459 = [Extent2].[ID]) AND ([Extent2].[WPId] = [Extent1].[WPId]))
Donc c'est clair que mon linq ne fonctionne pas comme sa en comparant les baseclaim.wpID à userprofile.wpid au lieu de COMME.
- Pourquoi utilisez-vous
like
? Il n'existe aucun%
caractères dansWPId
? - regarde ma réponse ci-dessous. J'espère qu'il le frappe.
- oui, il ya caractère % dans WPId
- OK, de sorte que certaines des réponses ci-dessous pourrait travailler pour vous, je pense.
- regarde mon édité réponse.
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas d'équivalent direct, mais il y a certaines méthodes fonctionnent de la même façon, selon le modèle.
string.Contains("pattern")
est équivalent àLIKE '%pattern%'
string.StartsWith("pattern")
est équivalent àLIKE 'pattern%'
string.EndsWith("pattern")
est équivalent àLIKE '%pattern'
Cependant, dans votre requête SQL le modèle est dynamique, donc je ne pense pas qu'il y est une bonne façon de convertir directement à Linq. Si vous savez au moment de la conception que le modèle convient à l'un de ces cas, vous pouvez utiliser ceci:
Ou éventuellement
Only arguments that can be evaluated on the client are supported for the String.Contains method.
🙂select WPId from UserProfiles where ID='1459'
, qui ne sélectionne qu'un seul enregistrement, et c'est ce que j'ai essayé de reproduire.%
les personnages de votre requête (si vous savez que c'est"%pattern%"
, puiswpId.Substring(1, wpId.Length - 2)
devrait faire l'affaire). Vous pouvez également mettre à jour la base de données directement.Vous devez utiliser contiennent
par exemple
Contient générer Comme lorsque le paramètre est constant
Espère que cela aide
Contains
! Cela ne veut pas dire quoi que ce soit..Contains(claimsRow.WPId)
. Vous n'avez pas l'ongle de l'erreur, juste donné quelques remarques générales.Cette requête fonctionne avec Entity Framework
Mais au lieu de
LIKE
il génèreCHARINDEX
opérationRemarque: avec Linq to SQL il jette NotSupportedException:
SqlMethods
🙂ÉDITÉ:
Le demandeur a déclaré qu'il a wild cards (
%
) dans son profil Utilisateur.WPId qui devraient fonctionner comme des caractères génériques dans SQL.Vous pouvez utiliser celui-ci:
BaseClaims.Where(b => UserProfiles.Where(u => u.ID == "1459").Any(u => u.WPId.Contains(b.WPId))).ToList();
Dans cet exemple, je vais essayer d'imiter vos entités/tables.