2010-04-08 16 views
6

Estoy intentando averiguar por qué una consulta simple en LINQ devuelve resultados impares.Consulta de LINQ que devuelve varias copias del primer resultado

Tengo una vista definida en la base de datos. Básicamente reúne muchas otras tablas y hace algo de munging de datos. Realmente no es nada especial, excepto por el hecho de que trata con un gran conjunto de datos y puede ser un poco lento.

Quiero consultar esta vista en función de un largo. Dos consultas de muestra a continuación muestran diferentes consultas a esta vista.

var la = Runtime.OmsEntityContext.Positions.Where(p => p.AccountNumber == 12345678).ToList(); 

var deDa = Runtime.OmsEntityContext.Positions.Where(p => p.AccountNumber == 12345678).Select(p => new { p.AccountNumber, p.SecurityNumber, p.CUSIP }).ToList(); 

El primero debe devolver una Lista. El segundo será una lista de objetos anónimos.

Cuando realizo estas consultas en el marco de Entidades, la primera me devolverá una lista de resultados donde todos son exactamente iguales.

La segunda consulta me devolverá los datos donde el número de cuenta es el que he consultado y los otros valores son diferentes. Esto parece hacer esto por número de cuenta, es decir, si tuviera que consultar un número de cuenta u otro, todos los objetos de Posición para una cuenta tendrían el mismo valor (el primero en la lista de Posiciones para esa cuenta) y la segunda cuenta tendría un conjunto de objetos de posición que tenían el mismo valor (una vez más, el primero en su lista de objetos de posición).

Puedo escribir SQL que es en efecto el mismo que cualquiera de las dos consultas de EF. Ambos regresan con resultados (digamos cuatro) que muestran los datos correctos, un número de cuenta con diferentes números de valores.

¿Por qué sucede esto? ¿Hay algo que podría estar haciendo mal para que, si tuviera cuatro resultados para la primera consulta anterior, los datos del primer registro también aparezcan en los objetos del 2-4º?

No puedo entender qué podría estar causando esto. He buscado en Google todo tipo de palabras clave y no he visto a nadie con este problema. Clasificamos parcialmente la clase Positions para una funcionalidad adicional (objeto inteligente) y algunas propiedades inteligentes. Incluso hay algunos constructores que proporcionan compatibilidad con algunos tipos de modelos de vista. Nada de esto se invoca en la solicitud (estoy 99% seguro de esto). Sin embargo, hacemos este mismo patrón en toda la aplicación.

Lo único que se me ocurre es que la asignación en el EDMX es complicada. ¿Hay alguna manera de que esto suceda si las "claves primarias" en el EDMX no fueran de hecho únicas dada la forma en que se construye la vista? Estoy pensando que el desarrollador que importó este modelo en el EDMX le permitió al diseñador seleccionar automáticamente lo que sería único.

¡Cualquier ayuda le daría a un desarrollador algo de esperanza!

+3

Tome la secuencia de comandos SQL generada y ejecútelo de forma interactiva en Management Studio para ver qué está sucediendo realmente –

+0

Como dije, tal vez use un generador de perfiles para ver el SQL que se está ejecutando. –

Respuesta

13

La respuesta a esta cuestión en particular es la siguiente:

asegurarse de que sus claves de entidad es único! !!

La vista tal como se generó en el EDMX tiene tres columnas/propiedades que se marcaron como claves de entidad (que supongo que la combinación de crear una identificación única para un registro).

En mis consultas, estas tres columnas eran todas iguales. Supongo que el marco de la entidad se asustó y simplemente colocó el primer registro en todos los registros subsiguientes hasta que una de esas columnas cambió (por lo tanto, un nuevo "conjunto" único).

Ahora que me he dado cuenta volví a mirar el lugar donde se usaba por primera vez esta información y vi que primero se aplicaba una declaración de agrupación (los datos se consultan a través de un procedimiento almacenado en otro lugar de la aplicación) El grupo aplanó una de las columnas clave de la entidad de modo que siempre fue única. Esto hace que los resultados en esa ubicación se vean bien.

Mi solución es agregar una nueva columna a esta vista que solo proyecta un GUID (usando NEWID() en SQL). ¡El problema es que sé que no sé cómo decirle al EDMX que use esta propiedad recién agregada como la única clave de entidad para la vista mapeada!

-Estoy cerrando esto como algo fijo ya que sé cuál es el problema y haré mi otra pregunta en una nueva pregunta. ¡Gracias por toda la información para aquellos que se tomaron el tiempo para responder!

+1

¿Te importaría vincular a la otra pregunta? – defines

+0

por favor háganos saber cómo lo estableció como un PK en vista o en edmx –

+0

Hola chicos, ojalá todavía tuviera acceso a esta base de código. Dejé esta posición no mucho más tiempo después de publicar esta pregunta/asnwer. Ha pasado un tiempo desde que tuve que hacer algo como esto en EF. Sería trivial en la API fluida. Si puedo recordar correctamente eliminé todas las claves individuales para no hacer una clave compuesta en el mapeo, sino que usé el guid creado en la vista como PK. –

0

¿Has probado este tipo de sintaxis? No se puede imaginar que es la causa, pero quién sabe ...

using (var dc = new OmsEntityContext()) 
{ 
    var la = (from p in dc.Position 
    where p.AccountNumber = "12345678" 
    select p).ToList(); 
} 

y

using (var dc = new OmsEntityContext()) 
{ 
    var deDa = (from p in dc.Position 
    where p.AccountNumber = "12345678" 
    select new {p.AccountNumber, p.SecurityNumber, p.CUSIP}).ToList(); 
} 

</longShot> 
Cuestiones relacionadas