2012-06-28 16 views
6

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.

+0

Hai provato? Ad esempio, restituire un 'espressione > 'e creare la query' dove GetEndDate (m) <= DateTime.Now'. – mellamokb

+0

Sì, e non funzionerà. Otterrai qualcosa sulla falsariga di "Impossibile confrontare Espressione >" e "DateTime'". – Ocelot20

+0

Hai provato la mia risposta? – Guillaume86

risposta

Problemi correlati