Sto cercando un modo per creare una funzione che possa essere utilizzata nelle query Linq che verranno tradotte in SQL. Indietro quando stavamo usando Linq-to-SQL, ho posto un simile question. La risposta è stata quella di mappare su una UDF nel db. Stiamo utilizzando il primo modello del codice a causa della pulizia della definizione del modello, ma sfortunatamente non c'è modo di fare il define functions, mappare le funzioni e mappare i proc memorizzati per quanto posso dire (suppongo che l'idea sia quel codice prima dovrebbe generare il db, e non dovrei aggiungere cose ad esso). Non mi sembra molto scalabile, dal momento che non consente un metodo facile per gestire le inefficienze che potrebbero evolvere nel tempo, ma non è né qui né là ...Codice EF Primo: metodi che possono tradurre in SQL
In ogni caso, so che posso definire espressioni di predicato che si tradurrà in SQL che posso utilizzare in mie domande in questo modo:
public static Expression<Func<MyEntity, bool>> FilterMe(int comparisonNumber)
{
return x => x.SomeProperty == comparisonNumber;
}
var query = MyEntities.Where(FilterMe(1));
è possibile solo questo per le espressioni che restituiscono bool
? Sto cercando qualcosa sulla falsariga di:
var query = from m in MyEntities
let endDate = GetEndDate(m.Start, m.Duration)
where endDate <= DateTime.Now
select m;
C'è qualche modo per costruire GetEndDate
in una funzione di espressione? Il codice all'interno di GetEndDate
si converte in SQL bene quando lo scrivo a mano nella query, ma è piuttosto lungo e confuso da leggere.
Modifica - Oh e prima che qualcuno risponda con "Usa SQLFunctions per DateAdd", il mio esempio è solo che ... un esempio. Ci sono innumerevoli altri modi in cui mi piacerebbe usarlo. Grazie in anticipo.
Hai provato? Ad esempio, restituire un 'espressione> 'e creare la query' dove GetEndDate (m) <= DateTime.Now'. –
mellamokb
Sì, e non funzionerà. Otterrai qualcosa sulla falsariga di "Impossibile confrontare Espressione>" e "DateTime'". –
Ocelot20
Hai provato la mia risposta? – Guillaume86