2008-11-11 12 views
6

Tenemos funciones escalares en nuestra base de datos para devolver cosas como "cantidad de tareas para un cliente" o "cantidad total de factura para un cliente".¿Es posible usar/acceder a las funciones escalares con LINQ to SQL?

Estamos experimentando y tratando de hacer esto sin procedimientos almacenados ... normalmente solo llamaríamos a esta función en nuestro procedimiento almacenado y la devolveríamos como un valor único.

¿Hay alguna manera de usar o acceder a las funciones escalares con LINQ to SQL? Si es así, me interesaría ver un ejemplo de cómo ... si no, ¿cómo sería mejor manejar este tipo de situación ... si es posible?

Respuesta

9

LINQ-to-SQL admite el uso con UDF, si eso es lo que quiere decir. Simplemente arrastre el UDF a la superficie del diseñador y listo. Esto crea un método de coincidencia en el contexto de datos, marcado [Function(..., IsComposable=true)] o similar, que indica a LINQ-to-SQL que puede usar esto en las consultas (tenga en cuenta que EF no admite este uso).

A continuación, utilizarlo en su consulta como:

var qry = from cust in ctx.Custs 
      select new {Id = cust.Id, Value = ctx.GetTotalValue(cust.Id)}; 

que se convertirá en TSQL algo como:

SELECT t1.Id, dbo.MyUdf(t1.Id) 
FROM CUSTOMER t1 

(o allí, rotondas).

El hecho de que sea composable significa que puede usar el valor en las consultas, por ejemplo en un Where()/WHERE, y así reducir los datos traídos del servidor (aunque obviamente la UDF aún deberá ejecutarse en de alguna manera).

Here's a similar example, mostrando un pseudo-UDF al usarlo en un contexto de datos, que ilustra que no se usa la versión C# del método.

Actualmente, estoy buscando en tales UDFs para proporcionar datos "fuera de modelo" de una manera composable, es decir, una parte particular del sistema necesita acceder a algunos datos (que están en la misma base de datos) que no es realmente parte del mismo modelo, pero que quiero JOIN de maneras interesantes. También tengo SP para este propósito ... por lo tanto, estoy considerando transferir esos SP a UDF tabulares, lo que proporciona un nivel de contrato/abstracción alrededor de los datos fuera del modelo. Entonces, como no forma parte de mi modelo, solo puedo obtenerlo a través del UDF, pero conservo la capacidad de componer esto con mi modelo habitual.

1

Creo que this MSDN documentation es lo que buscas (como parte de this wider topic of calling user-defined functions in LINQ to SQL). No puedo decir que lo he hecho yo mismo, pero parece correcto ...

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. – gotqn

+1

@gotqn: De hecho, y ciertamente lo habría hecho hoy. Tenga en cuenta que esta respuesta fue publicada en la infancia de Stack Overflow ... –