Convertir de Sql a Linq

Tengo, lo que pensé que era una consulta bastante directa.

En Sql normal, esto sería:

SELECT    [column names]
FROM      agentscheduledetail
WHERE     (date = '2012-07-04') AND 
           (
            exception = 'Break (No Sign Off)' OR
            exception = 'Break' OR
            exception = 'Break (Signed Out)'
           )

Esto devuelve aproximadamente 900 registros.

Sin embargo, cuando trato de ingresar esto en mi controlador, termino con alrededor de 300,000 registros, por lo que creo que mis AND y OR no funcionan. Probé Linqer, pero no puedo hacer que funcione (soy consciente de que esto puede no ser LINQ real sino la consulta equivalente en VS, si hay una versión de linq ... También estaría agradecido por eso si posible).

Mi consulta de controlador es:

        var dte = DateTime.Today;

        return View(db.agentscheduledetails.Where
           (
            d => d.date == dte && d.agentName.StartsWith("ta") && 
             (
              d.exception == "Break (No Sign Off)" || 
              d.exception == "Break" || 
              d.exception == "Break (Signed Out)"
             )
            ).ToList()
           );

¿Alguien puede a) decirme dónde me estoy equivocando con mi && || (y/o), o b) ¿hay alguna manera de recorrer paso a paso el código en VS, para ver a qué se traduce la consulta anterior en SQL normal para que pueda intentar averiguar dónde me estoy equivocando?

Gracias por cualquier ayuda,

Mark

preguntado el 04 de julio de 12 a las 09:07

intente usar .Contains () para verificar la cadena -

No ha especificado si está usando LINQ to SQL o Entity Framework, pero de cualquier manera, sí, hay formas de ver el SQL generado. Ver DataContext.Log por ejemplo en LINQ to SQL. -

Configure el contexto de la base de datos para generar consultas SQL en un archivo de registro o en las ventanas del depurador. Compruebe que es correcto. -

Hola, es Entity Framework: generé mis clases, hice clic en Agregar controlador en VS y dejé que compilara el código del controlador predeterminado usando EF. Todo lo que intento hacer es filtrar la consulta básica que genera en el método GET. Contiene devuelve lo mismo. ¿Cómo configura DB Context para generar consultas? VS también configuró DBContext automáticamente cuando creé el controlador. Gracias. -

si crea un objeto de consulta, por ejemplo, var q=...where... (perdiendo el ToList() al final. El depurador de Visual Studio le mostrará el SQL generado si inspecciona el valor. -

2 Respuestas

La siguiente es quizás una versión simplificada de lo que está tratando de hacer, ¿también su LINQ contiene una declaración adicional en comparación con el SQL donde compara el nombre del agente?

var currentDate = DateTime.Today;
var exceptionTypes = new List<string>() { "Break (No Sign Off)", 
                                          "Break", "Break (Signed Out)" };

db.agentscheduledetails.Where(d => d.date == currentDate && 
                                           exceptionTypes.Contains(d.exception));

Una cosa que podría intentar es obtener una copia de LinqPad, esto le permitirá ejecutar su declaración LINQ en una base de datos y le mostrará cuál es la declaración SQL generada.

Respondido 04 Jul 12, 15:07

hola - gracias - eso funciona perfecto. ¿No puedes usar && y || en las declaraciones que estaba haciendo? (Lo marcaré como respuesta tan pronto como SO lo permita) - saludos, Mark - Mark

Si ejecuto algo similar en LinqPad, obtengo el resultado deseado y el SQL correcto. Sin embargo, no estoy seguro de su configuración, si es Entity Framework, entonces no estoy seguro de lo que sucederá, pero en Linq to SQL normal, ¿debería funcionar bien? Sin embargo, este método tiende a ser el preferido, ya que generalmente es más simple de escribir. - daz-fuller

Aparte de cualquier otra cosa,

    d.agentName.StartsWith("ta")

no aparece en su sql original...?

Respondido 04 Jul 12, 09:07

tienes razón - lo agregué para ver si filtraría más los registros - no lo hizo... - Mark

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.