2011-05-30 5 views
2

J'ai cherché comment faire cela, et j'ai trouvé quelque chose de proche, mais pas tout à fait ce que je cherche. Je me demande si cela pourrait aider les autres aussi, mais je pourrais vraiment utiliser l'aide. J'ai une instruction SELECT assez simple je dois convertir en LINQ to SQL pour accélérer les recherches dans notre logiciel:Comment écrire SQL INNER JOIN SELECT avec plusieurs conditions (avec LIKE) requête à LINQ to SQL

SELECT Animals.* 
FROM Animals 
     INNER JOIN AnimalAliases 
     ON Animals.AnimalID = AnimalAliases.AnimalID 
     AND AnimalAliases.Alias LIKE N'%USERINPUT%'; 

Fondamentalement, je veux être en mesure de faire une jointure interne avec plusieurs conditions, mais l'une des conditions n'a rien à voir avec l'une des tables, l'instruction LIKE, où je suis coincé.

var query = 
    from animal in context.Animals 
    join animalAlias in context.AnimalAliases 
     on new { animal.AnimalID, "USERINPUT" } 
    equals new { animalAlias.AnimalID, animalAlias.Alias } 
    select animal; 

mais cela ne fonctionne évidemment pas, parce que je ne veux pas EQUALS à UserInput, je veux effectuer diverses opérations comme sur elle ..

Quelqu'un at-il aperçu?

Répondre

0

Cela fera l'affaire:

IQueryable<Animal> query = 
    from animal in context.Animals 
    where animal.AnimalAliases 
     .Any(a => a.Alias.Contains("USERINPUT")) 
    select animal; 

Vous pouvez faire l'inverse (commencer à l'entité AnimalAlias au lieu de partir de l'entité Animal):

IQueryable<Animal> query = (
    from animalAlias in context.AnimalAliases 
    where animalAlias.Alias.Contains("USERINPUT") 
    select animalAlias.Animal) 
    .Distinct(); 
+0

Mais il doit retourner un IQueryable mis donc je pense que le premier est la réponse. Je l'ai effectivement compris d'une autre manière, je ne sais pas si cela aide quelqu'un ou si elle a même une validité, je n'ai pas vérifié l'exactitude: – Philippe

+0

IQueryable query = d'un in search.Animals rejoindre al dans search.AnimalAliases sur un. AnimalID est égal à al.AnimalID où al.Alias.Contains ("USERINPUT") sélectionne un; – Philippe

+0

Veuillez arrêter d'utiliser 'jointes 'dans linq. Ils obscurcissent votre code, et sont dans la plupart des situations inutiles, parce que le O/RM connaît déjà les relations. – Steven

3

I pensez-vous que ce que vous cherchez est juste une clause WHERE normale? Le texte d'alias ne fait pas partie de la relation de clé étrangère - il ne devrait donc pas figurer dans la jointure.


Mise à jour - après les commentaires - y compris de @Steven - alors que la requête ci-dessus est correct et ne reproduit le SQL d'origine - il pourrait être judicieux d'utiliser Distinct() sur la sortie - cela empêchera le cas où plusieurs des correspondances alias peuvent se produire pour un seul animal.

var query = (from animal in context.Animals 
    join animalAlias in context.AnimalAliases on animal.AnimalID equals animalAlias.AnimalID 
    where animalAlias.Alias.Contains(USERINPUT) 
    select animal).Distinct(); 
+0

Ah, je viens d'écrire celui-là aussi. Merci pour l'aide cela a amélioré les vitesses de recherche sur les alias d'animaux par centaines de pour cent je suis sûr que sur de grandes bases de données. Avant la façon dont je le faisais c'était terrible et impliqué tous les animaux tout le temps. – Philippe

+1

Veuillez noter que votre requête peut renvoyer des doublons. Vous devriez appeler '.Distinct()' dessus pour obtenir des valeurs uniques. – Steven

+0

@Steven - Bon point - même si c'est effectivement ce que le SQL original fait aussi – Stuart