Ho un determinato campo calcolato che desidero regolarmente restituire nei campi "select" di una query Linq, ad es. L'ordine del cliente è totale quest'anno, insieme ad altre informazioni demografiche del cliente.Come astrarre un campo nell'elenco Seleziona di una query Linq?
public class Customer {
public decimal TotalPurchasesThisYear(MyDataContext db) {
return db.Orders.Where(o => o.CustomerID == ID)
.Sum(o => o.OrderTotalAmt);
}
}
public class SomeReport {
public void GetCustomerInfoBySalesperson(long salespersonID) {
using (var db = new MyDataContext()) {
var q = db.Customers.Where(c => c.SalespersonID == salespersonID)
.Select(c => new { c.Name, c.Address, ThisYearPurchases = c.TotalPurchasesThisYear(db) })
.ToList();
// etc..
}
}
}
Ovviamente, questo non funziona, perché non ha TotalPurchasesThisYear
traduzione SQL. Ma tutto all'interno di esso ha una traduzione SQL. Non voglio includere quel codice direttamente nella query, perché sto facendo lo stesso calcolo in molti posti. Il mio istinto mi dice che questo dovrebbe essere fatto con un Expression
ma ho giocato intorno e non riesco a capire la sintassi giusta.
Aiuto, qualcuno? Grazie!
Quello che ho appena commentare qui è che si sta violando Persistenza Ignoranza: http://msdn.microsoft.com/en-us/ rivista/dd882510.aspx. Il modello dipende dal livello persistente, ad esempio è necessario considerare l'utilizzo di Reposistory. –
@CuongLe - Non sono così preoccupato per quanto riguarda strettamente il Cliente e l'Ordine; questo è solo un semplice esempio di ciò che sto cercando di fare, comunque. Sto seguendo il * principio * di come astrarre un campo nella clausola Select. –
L'accoppiamento stretto è un problema che non puoi ignorare. I metodi che mostri sono repository o metodi di servizio tipici. Se non è l'ignoranza della persistenza, allora è una singola responsabilità di cui dovresti preoccuparti. Il cliente non sembra nemmeno avere una raccolta ordini, quindi non ha nulla a che fare con gli ordini. Quando un approccio causa problemi, affrontalo alla radice. Questo è solo qualcosa che non dovresti fare. Richiede una soluzione complessa che è destinata a introdurre nuovi problemi. Solo un consiglio ツ. –