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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top