Problema Linq.NHibernate con l'istruzione OR
-
11-09-2019 - |
Domanda
NOTA:tutto il codice è scritto in cima alla mia testa.Può contenere alcuni errori.Basta capire il punto generale di questa domanda)
Prendendo questa definizione di classe:(ridotto per semplicità)
public class CodedValue
{
public string Code { get; set; }
public string Value {get; set; }
}
Prendendo questi oggetti:
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 contiene un elenco di CodedValue da filtrare.
Facciamo finta che il mio database contenga questi record:
CODE VALUE
A 1
A 2
B 1
B 2
Ora, voglio recuperare tutti gli oggetti in cui il valore codificato è nell'elenco
var filter = from o in MyRepository.List()
where cvList.Contains(o.CodedValue)
select o;
NHibernate traduce questo Linq in questo:
select [Fields...] from [Table...]
where Code in ('A', 'B') and Value in ('1', '2');
Questo è sbagliato.Se dai un'occhiata al mio esempio di record, questo SQL restituirà tutte le righe.L'SQL dovrebbe essere tradotto in:
select [Fields...] from [Table...]
where (Code = 'A' and Value = '1') or (Code = 'B' and Value = '2');
Quindi, posso ottenere il risultato che desidero utilizzando Linq?Se é cosi, come?In caso contrario, come posso raggiungere questo obiettivo?
Grazie
Soluzione
Ok, ecco la soluzione!
Sto utilizzando PredicateBuilder da questo sito Web: PredicateBuilder
Quindi, costruisco il predicato:
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 linea CodedValue cv = codedValue
nel foreach
dichiarazione È MOLTO IMPORTANTE.Omettendo la riga si costruirà la sintassi SQL corretta, ma i valori dei parametri saranno gli stessi per tutti.
Spero davvero che possa aiutare qualcuno.