Método personalizado en LINQ to SQL query

¿Es posible utilizar un método personalizado en la consulta, por ejemplo:

var result = from u in context.MyTable where MyMethod(u) == 10 select u;
 John Saunders03 sept. 2010 13:51
¿Qué pasó cuando intentaste eso?
 John Saunders03 sept. 2010 14:02
@snorlaks: gracias, y ahora sabes que "LINQ" no implica LINQ to SQL.
 gruber03 sept. 2010 13:54
Su linq a sql, el error es que no conoce sql para ese método
 XstreamINsanity03 sept. 2010 13:51
¿Ya lo probaste? ¿O es solo una pregunta de conocimiento general?
 John Saunders03 sept. 2010 13:52
¿Quiso decir LINQ to XML, LINQ to SQL, LINQ to SomethingWeveNeverHeardOf?

Respuestas a la pregunta(3)

pero si está utilizando Linq-to-Sql, su método debe tener un código especial para manejar la conversión a SQL.

 cjk03 sept. 2010 14:03
No, nunca he hecho esto.
 gruber03 sept. 2010 13:54
¿Podría darme algún ejemplo?

Qué es y qué no es posible con linq

Seguir no es posible

// function used in filter
static bool MyFunc(Nwind.Product p)
{
  return p.ProductName.StartsWith("B");
}
// query that uses MyFunc
var q = 
  from p in db.Products
  where MyPriceFunc(p.UnitPrice) > 30m
  select p

Se compila sin errores, pero cuando lo ejecuta LINQ to SQL produce una excepción que dice: "Método estático System.Boolean MyTest (LINQTest.Nwind.Product) no tiene traducción compatible a SQL".

La excepción se produce realmente cuando intenta obtener resultados de q (por ejemplo, utilizando la instrucción foreach), porque LINQ to SQL intenta convertir los árboles de expresión a T-SQL solo cuando los resultados son necesarios y la consulta debe ejecutarse.

Para arreglar el ejemplo, simplemente puede copiar el código que verifica si el nombre del producto comienza con "B" en la cláusula where de la consulta y funcionaría bien.

Solución de preguntas

no puede tener un método personalizado (C #) como parte de la consulta LINQ to SQL, porque LINQ to SQL no podría ver el árbol de expresión del método y, por lo tanto, no puede traducirlo a SQL.

Una opción que tiene es escribir su función en SQL y almacenarla como una función de SQL en el SQL Server (posiblemente, también podría usar SQL CLR, pero no lo he intentado). Luego puede agregar la función a suDataContext type y LINQ to SQL lo traducirán a llamadas a la función en el servidor SQL. Algo como:

var result = from u in context.MyTable 
             where context.MyMethod(u) == 10 select u; 

El problema, por supuesto, es que necesitará escribir la función en SQL (creo que SQL CLR también podría funcionar, aunque no estoy seguro sobre el rendimiento y otras posibles complicaciones)

Yo tambiénescribió un artículo (hace algún tiempo) que muestra cómo hacer esto cuando escribe el "método" como una forma de árbol de expresión (como un valor de tipoExpression<Func<...>>), lo cual es posible, porque en este caso, el código se compila como un árbol de expresión. Sin embargo, hay algo de procesamiento posterior que debe hacerse y aún puede escribir una sola expresión que se pueda insertar fácilmente en la consulta LINQ.

 Richard Griffiths17 ago. 2017 12:42
Hola Thomas, ¿tienes alguna actualización sobre este artículo? Estoy trabajando en código heredado y necesito la capacidad de generar una consulta de búsqueda en un antiguo proyecto basado en Linq to Sql. Leí este artículo y golpeé una pared de ladrillos con la extensión expandible, ya que ahora tiene algunos años. Cualquier ayuda sería muy apreciada! :)

Su respuesta a la pregunta