Innanzitutto, devo dire che ho letto diversi post su questo a StackOverflow ma non riesco a ottenere il risultato desiderato.Linq-to-SQL che combina due espressioni <Func <T, bool>> ("clausola where") con e/o
Lasciatemi spiegare il contesto (semplificato): sto utilizzando Linq-to-SQL per interrogare i clienti con visite recenti al negozio e (facoltativamente) ottenere solo quelli con una certa quantità di pagamenti. Supponiamo di avere un modello con classi di clienti, visite e pagamenti.
Quindi, concentrandosi sulla Where
espressione, sto cercando questo:
Expression<Func<Entityes.Clients, bool>> filter = null;
filter = c =>
c.Visits.Any(v => v.VisitDate > DateTime.Now.Date.AddMonths(-(int)visitsSince));
if (minPayment.HasValue && minPayment.Value > 0)
{
filter.And(
c => c.Payments.Sum(p => p.Quantity) > minPayment.Value);
}
Il metodo filter.And
è un metodo di estensione, consigliato in questo forum, qui sotto potete vedere la definizione:
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1,
Expression<Func<T, bool>> expression2)
{
InvocationExpression invokedExpression =
Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>
(Expression.And(expression1.Body, invokedExpression), expression1.Parameters);
}
Tuttavia, questo non funziona come previsto e i risultati non vengono filtrati in base all'ammontare del pagamento. Non v'è alcun errore con i dati o LINQ to SQL modello perché questo codice funziona bene:
filter = c =>
c.Visits.Any(v => v.VisitDate > DateTime.Now.Date.AddMonths(-(int)visitsSince)))
&& c => c.Payments.Sum(p => p.Quantity) > minPayment.Value;
Tuttavia, non voglio usare l'ultimo codice perché ho alcuni scenari più complessi, in cui ho bisogno di costruisci l'espressione del filtro passo dopo passo con una combinazione 'e/o' di ciascuna parte.
PD: Sono un tipo "ADO.Net DataSets" che cerca di imparare Linq-to-SQL e presto Entity Framework, spero di essere presto utile alla comunità di StackOverflow.
p.s., si dovrebbe usare il metodo 'Expression.AndAlso()' per generare l'espressione AND logica ('&&'). 'Expression.E()' genera l'espressione AND bit a bit ('&'). –