2009-12-01 2 views
1

REMARQUE: tout le code est écrit en haut de ma tête. Il peut contenir quelques erreurs. Procurez-vous le point d'ensemble de cette question)Problème Linq.NHibernate avec l'instruction OR

Prendre cette définition de la classe: (réduite pour simplifier) ​​

public class CodedValue 
{ 
    public string Code { get; set; } 
    public string Value {get; set; } 
} 

Prendre thoses objets:

CodedValue cv1 = new CodedValue(){ Code = "A", Value = "1" }; 
CodedValue cv2 = new CodedValue(){ Code = "B", Value = "2" }; 
IList<CodedValue> cvList = new List<CodedValue>(); 
cvList.Add(cv1); 
cvList.Add(cv2); 

cvList contient une liste de CodedValue pour filtrer .

Lets prétendre que ma base de données contient thoses enregistrements:

CODE  VALUE 
A  1 
A  2 
B  1 
B  2 

Maintenant, je veux récupérer tous les objets où le codedvalue est dans la liste

var filter = from o in MyRepository.List() 
      where cvList.Contains(o.CodedValue) 
      select o; 

NHibernate traduire ce Linq à cela:

select [Fields...] from [Table...] 
where Code in ('A', 'B') and Value in ('1', '2'); 

Ceci est faux. Si vous jetez un oeil à mon exemple d'enregistrements, ce SQL retournera toutes les lignes. Le SQL devrait être traduit en:

select [Fields...] from [Table...] 
where (Code = 'A' and Value = '1') or (Code = 'B' and Value = '2'); 

Alors, je peux obtenir le résultat que je veux en utilisant Linq? Si c'est le cas, comment? Si non, comment puis-je y parvenir?

Merci

Répondre

5

Ok, voici la solution!

J'utilise PredicateBuilder de ce site: PredicateBuilder

Ensuite, je construis le prédicat:

var expr = PredicateBuilder.False<Audit>(); 

foreach(CodedValue codedValue in auditEventIds) 
{ 
    CodedValue cv = codedValue; 
    expr = expr.Or(a => (a.EventId.Code == cv.Code) && (a.EventId.CodeSystemName == cv.CodeSystemName)); 
} 

itemQuery = itemQuery.Where(expr); 

La ligne CodedValue cv = codedValue dans la déclaration foreach EST TRÈS IMPORTANT. Omettre la ligne construira la syntaxe SQL correcte, mais les valeurs des paramètres seront les mêmes pour tous. J'espère vraiment que ça va aider quelqu'un.

+0

Cela vient de faire ma nuit ... Je suis tellement heureux en ce moment. –