2010-11-23 19 views
5

chicos ¿Cómo puedo alcanzar el siguientelas funciones de llamada en LINQ to SQL .NET 3.5

var productslist=from p in productsTable 
       select new product{Id=p.Id,Tax=myfunctions.calculateTax(p.price)}; 

he tratado de google y encontré este document. ¿Hay otra manera en que puedo hacer esto sin usar dlls de terceros?

Solución: Mueva la aplicación a .NET 4.0 (esto es realmente compatible y se supone que funciona). Nway me quedé con la siguiente solución por el momento

+0

¿'calculateTax' es un procedimiento/función almacenada en su DB? – Gabe

+0

no .es una función en mi código – lafama

+0

Marque el enlace arriba del enlace "documento". tiene un dll que le permite usar .ToExpandable() en sus consultas de Linq – lafama

Respuesta

6

¿Está tratando de llamar a una local función, o una en la base de datos? Si se trata de una función local y es lo último que se está haciendo, es fácil - sólo tiene una llamada a AsEnumerable() para forzar al resto de la consulta se ejecute localmente:

var products = productsTable.AsEnumerable() 
          .Select(p => new Product 
            { p.Id, Tax = CalculateTax(p.Price) }); 
+0

Es un funciones locales. Por favor explique lo que quiere decir ser el "resto de la consulta para ejecutar localmente". pensé que era posible ejecutar toda la consulta en el db – lafama

+0

@lafama: no si estás intentando ejecutar el código local, no. Básicamente, mi versión anterior extraerá datos de la base de datos y llamará a 'CalculateTax' en cada pieza de datos devuelta. Si desea que el cálculo del impuesto se ejecute en la base de datos, debe escribir un procedimiento almacenado o UDF. –

+0

Mi única nota es que esto podría obtener columnas innecesarias, pero dado que ya nos falta un 'dónde', eso parece quisquilloso; p –

11

LINQ to SQL no puede mágicamente traducir arbitrario C# a TSQL; una selección limitada de la sintaxis necesaria comúnmente está disponible dentro de LINQ, pero un método C# no va a funcionar.

Opciones:

  • reescribir la función como una UDF (en TSQL) y mapa de la UDF a los datos de contexto (es decir, arrastrar el UDF sobre la superficie diseñador); myDataContext.MyUdf(args) utilizar en LINQ
  • aplique su función de una sola vez los datos están de vuelta en la tierra NET-
  • re-escribir la función como LINQ proyección

espero que la opción de en medio es el más fácil en su guión. Por ejemplo:

var productslist= 
      (from p in productsTable 
      select new {Id=p.Id,p.price}).AsEnumerable() 
      .Select(p => new {p.Id, Tax=myfunctions.calculateTax(p.price)}); 

Los AsEnumerable() rompe "composición" - es decir, que se detenga LINQ a SQL de tratar de entender calculateTax en términos de TSQL; solo el Id y el price se recuperan de SQL; luego mientras procesa cada fila aplica la segunda proyección para calcular el impuesto.