2012-06-28 14 views
6

Estoy buscando una forma de crear una función que se pueda usar en mis consultas Linq que se traducirán a SQL. Cuando estábamos usando Linq-to-SQL, planteé un question similar. La respuesta fue mapear a un UDF en el db. Estamos utilizando el primer modelo de código debido a la limpieza de la definición del modelo, pero desafortunadamente no hay forma de define functions, asignar funciones y mapear procs almacenados hasta donde yo sepa (supongo que la idea es que el código primero debería generar el DB, y no debería agregarle cosas). No me parece muy escalable, ya que no permite un método fácil para tratar las ineficiencias que pueden evolucionar con el tiempo, pero eso no está aquí ni allá ...Código EF Primero: Métodos que se pueden traducir a SQL

De todos modos, sé que puedo definir expresiones de predicados que se traducirá en SQL que puedo usar en mis consultas, así:

public static Expression<Func<MyEntity, bool>> FilterMe(int comparisonNumber) 
{ 
    return x => x.SomeProperty == comparisonNumber; 
} 

var query = MyEntities.Where(FilterMe(1)); 

Es éste sólo es posible para las expresiones que devuelven bool? Estoy buscando algo en la línea de:

var query = from m in MyEntities 
      let endDate = GetEndDate(m.Start, m.Duration) 
      where endDate <= DateTime.Now 
      select m; 

¿Hay alguna manera de construir GetEndDate en una función de expresión? El código dentro de GetEndDate se traduce en SQL muy bien cuando lo escribo a mano en la consulta, pero es bastante largo y confuso de leer.

Editar - Ah, y antes de que alguien responda con "Usar SQLFunctions para DateAdd", mi ejemplo es simplemente ese ... un ejemplo. Hay muchas otras maneras en que me gustaría usar esto. Gracias por adelantado.

+0

¿Lo intentó? es decir, devuelve un 'Expression >' y realiza la consulta 'donde GetEndDate (m) <= DateTime.Now'. – mellamokb

+0

Sí, y eso no funcionará. Obtendrá algo similar a "No se puede comparar' Expresión > 'y' DateTime' ". – Ocelot20

+0

¿Has probado mi respuesta? – Guillaume86

Respuesta

Cuestiones relacionadas