Soy nuevo en Linq y tratando de convertir este procedimiento almacenado de SQL Server en Linq, estoy construyendo un Silverlight de negocio de la aplicación y es necesario llamar a este procedimiento para volver una cuadrícula de resultados.

Tengo varios parámetros que los usuarios pueden utilizar para la búsqueda de piezas en particular. Ellos estrechar abajo su búsqueda a través de la interfaz de usuario y cuando se pulse el botón de búsqueda, el código detrás de la toma de todos los argumentos y se envía a mi Linq servicio, que luego, se debe llamar al procedimiento almacenado.

Aquí es el procedimiento almacenado.

ALTER PROCEDURE dbo.spSearchResults
@PieceType      nvarchar(6) =  '',
@FileType       nvarchar(3) = '',
@Market     nvarchar(6) = '',
@PieceNumber        nvarchar(6) = '',
@Header1    nvarchar(50) = '',
@Header2    nvarchar(50) = '',
@Header3    nvarchar(50) = '',
@Header4    nvarchar(50) = '',
@JobNumber      nvarchar(50)=' ',
@bShowInActive  BIT = 0,
@UDAC1      nvarchar(50) = '',
@UDAC2      nvarchar(50) = '',
@UDAC3      nvarchar(50) = '',
@UDAC4      nvarchar(50) = ''   
AS
BEGIN
SET NOCOUNT ON
SELECT J.* 
FROM Job J
LEFT JOIN JobHeading H1 (NOLOCK) ON J.[JobNumber] =  H1.[JobID]
LEFT JOIN JobHeading H2 (NOLOCK) ON J.[JobNumber] =  H2.[JobID]
LEFT JOIN JobHeading H3 (NOLOCK) ON J.[JobNumber] =  H3.[JobID]
LEFT JOIN JobHeading H4 (NOLOCK) ON J.[JobNumber] =  H4.[JobID]
LEFT JOIN JobUDAC udac1 (NOLOCK) ON J.[JobNumber] = udac1.[JobID]
LEFT JOIN JobUDAC udac2 (NOLOCK) ON J.[JobNumber] = udac2.[JobID]
LEFT JOIN JobUDAC udac3 (NOLOCK) ON J.[JobNumber] = udac3.[JobID]
LEFT JOIN JobUDAC udac4 (NOLOCK) ON J.[JobNumber] = udac4.[JobID]
WHERE ((@PieceType = '') OR (PieceType = @PieceType))
AND ((@FileType = '') OR (FileType = @FileType))
AND ((@Market = '') OR (Market = @Market))
AND ((@PieceNumber = '') OR (PieceNumber = @PieceNumber))
AND ((@JobNumber = '') OR (JobNumber = @JobNumber))
AND (J.IsActive=1 OR @bShowInActive = 1)
AND (((@Header1 = '' AND @Header2 = '' AND @Header3 = '' AND @Header4 = '') OR 
H1.HeadingRowID = @Header1)
OR ([email protected]=0 OR 
H2.HeadingRowID = @Header2 )
OR ([email protected]=0 OR 
H3.HeadingRowID = @Header3)
OR ([email protected]=0 OR 
H4.HeadingRowID = @Header4))
AND (((@UDAC1 = '' AND @UDAC2 = '' AND @UDAC3 = '' AND @UDAC4 = '') OR 
udac1.UDACRowID = @UDAC1)
OR ([email protected]=0 OR 
udac2.UDACRowID = @UDAC2 )
OR ([email protected]=0 OR 
udac3.UDACRowID = @UDAC3)
OR ([email protected]=0 OR 
udac4.UDACRowID = @UDAC4))

En Linq me encontré con que hay ciertas conversiones a hacer, y este es mi intento.

var query = from j in Job
join JobHeading H1 in Job on headingRowID1 equals H1
join JobHeading H2 in Job on headingRowID2 equals H2
join JobHeading H3 in Job on headingRowID3 equals H3
join JobHeading H4 in Job on headingRowID4 equals H4
join JobUDAC udac1 in Job on udacRowID1 equals udac1
join JobUDAC udac2 in Job on udacRowID2 equals udac2
join JobUDAC udac3 in Job on udacRowID3 equals udac3
join JobUDAC udac4 in Job on udacRowID4 equals udac4
join PieceType in db on piece equals PieceType
join JobFileType in db on filetype equals JobFileType
join Book in db on market equals Book
join PieceNumber in db on pieceNumber equals PieceNumber
join JobNumber in db on jobNumber equals JobNumber
join Job in db on FindJobs equals db
where ((piece = string.Empty) || (PieceType = piece))
&& ((filetype = string.Empty) || (JobFileType = filetype))
&& ((market = string.Empty) || (Book = market))
&& ((pieceNumber = string.Empty) || (PieceNumber = pieceNumber))
&& ((jobNumber = string.Empty) || (JobNumber = jobNumber))
&& (showInActive = true)
&& ((((headingRowID1 = string.Empty) + (headingRowID2 = string.Empty) + (headingRowID3 = string.Empty) + (headingRowID4 = string.Empty)) ||
H1.HeadingRowID = headingRowID1)
|| (H2.HeadingRowID = headingRowID2)
|| (H3.HeadingRowID = headingRowID3)
|| (H4.HeadingRowID = headingRowID4))
&& ((((udacRowID1 = string.Empty) + (udacRowID2 = string.Empty) + (udacRowID3 = string.Empty) + (udacRowID4 = string.Empty)) ||
udac1.UDACRowID = udacRowID1)
|| (udac2.UDACRowID = udacRowID2)
|| (udac3.UDACRowID = udacRowID3)
|| (udac4.UDACRowID = udacRowID4))
select j.Job;
return query;

Sin embargo, el principio «Trabajo» tiene un error, y dice » no se pudo encontrar una aplicación … ‘unirse’ no encontrado’ ¿Puede alguien ayudarme a traducir? O ofrecer una mejor manera de llamar al procedimiento almacenado con el código que está detrás? Gracias

  • ¿por qué no dejarlo como un procedimiento almacenado?
  • porque tenemos una linq servicio configurado ya para todo lo demás que hace la aplicación, pero no importa, ¿cómo puedo llamar al procedimiento almacenado, entonces? Mis intentos también han fallado.
  • Echa un vistazo a este enlace, usted puede llamar a los procedimientos de la DBContext
  • además de no tener que volver a escribir en linq, el procedimiento almacenado será más rápido si dejarlo como está
InformationsquelleAutor jcc | 2012-07-11

2 Comentarios

  1. 3

    Usted puede añadir su tienda procedimiento para la entidad de contexto y llamar a un método.

    Para lograr esto, usted tiene que agregar el procedimiento de almacenamiento para el modelo de entidad. No dicen cómo están construyendo el modelo o qué versión de EF que se usa, pero yo asumo que usted puede seguir adelante y actualizar el modelo de la base de datos y agregar el procedimiento de almacenamiento.

    Una vez que usted tiene el SP en el modelo que usted tiene que girar el SP en una Función de Importación. La manera de hacerlo es accediendo a la tienda de procedimiento en el Explorador de modelos, haga clic en el SP icono y seleccione «Agregar la función de importación». Porque usted está regresando de un complejo conjunto de resultados, le sugiero que construir un Tipo Complejo, que se utilizará como el tipo de resultado de la SP. Para crear un Tipo Complejo en el Complemento de la Función de Importación de diálogo haga clic en «Obtener Información de la Columna» botón. Que se presentan los valores de retorno de su SP, así que usted puede crear un nuevo Tipo Complejo, haciendo clic en el «Crear Nuevo Complejo Tipo» botón. Darle un nombre y haga clic en ACEPTAR. La función de importación está ahora bajo «de las Importaciones de Función» en el Explorador de modelos.

    La forma de llamar la función de importar el método es:

    var result = context.spSearchResults(Your list of parameters...);

    Se ejecuta el SP, y el «resultado» debe darle una lista de objetos del tipo de la de tipo complejo.

    Un par de referencias:

    http://msdn.microsoft.com/en-us/library/bb896231.aspx

    http://msdn.microsoft.com/en-us/library/ee534438.aspx

    Sólo para ser completa: otra forma en que usted puede añadir un tipo complejo es: en el Modelo de Navegador, vaya a «Tipos Complejos», haga clic derecho y seleccione «Crear el Tipo de Complejo». Hay que definir un tipo complejo que tiene las mismas propiedades (nombres y tipos) de los resultados de su SP. En el cuadro de diálogo seleccionar Complejo en el «Devuelve una Colección de»,

    Espero que esto ayude.

    • Que está trabajando hasta ahora, sólo para aclarar, mi contexto es lo nuevo? Y si lo puse a mi ‘Trabajo’ la spSearchResults decir que es indefinido.
    • En var consulta = de la j en el Trabajo, es su ObjectContext (msdn.microsoft.com/en-us/library/…), que es el objeto que proporciona los mecanismos para trabajar con los objetivos EF y su almacén de datos. Son los que se ejecuta el contexto antes de usarla?
  2. 0

    Para llamar a un procedimiento almacenado utilizando linq acaba de ir al explorador de servidores para conectarse con la base de datos y, a continuación, seleccione la carpeta Procedimientos Almacenados, y arrástrelo a la dbml archivo del diseñador. Se le nota que se agrega un método en el diseñador.
    A continuación, sólo una instancia del contexto y llame a su procedimiento.
    ejemplo:
    Ejemplo De Linq StoredProcedures

Dejar respuesta

Please enter your comment!
Please enter your name here