2010-04-21 4 views
5

Tengo que invocar 2 consultas linq2sql y tengo un problema ya que la consulta 2 no devuelve el mismo número de columnas, lo que es extraño después de .ToList() en las consultas, pueden concat sin problema.por qué LINQ 2 SQL en algún momento agrega un campo como seleccionar 1 como prueba, otros campos válidos

La razón es, por alguna razón linq2sql, tengo 2 más columna denominada prueba y test2 que vienen de 2 Unión externa izquierda que linq2sql crear automáticamente, algo así como "seleccione 1 como prueba, TableFields"

¿Hay alguna buena razón para eso? cómo eliminar este campo adicional "1 como prueba"?

aquí unos pocos ejemplos de lo que se vea como: google result for linq 2 sql "select 1 as test"

+0

¿por qué un voto a favor? – Fredou

+0

Lo he visto, es raro, hasta donde sé, no hay nada que puedas hacer al respecto. Nunca lo he visto causar problemas: debe publicar el código real que está fallando si está rompiendo su aplicación. – Aaronaught

+0

lamentablemente, no puedo publicar el código real que lo ocasiona – Fredou

Respuesta

4

OK, vamos a suponer que tenemos 2 tablas: dbo.User y dbo.Client. Cada client se puede conectar (o no) al user. Por lo tanto, los registros client tienen un campo de clave externa anulable que identifica un user.

para la consulta:

var query = context.Clients 
     .Select(c => c.User); 

LINQ producirá algo similar a:

SELECT [t2].[test], [t2].[Id], [t2].[Username], ... 
FROM [dbo].[Client] AS [t0] 
LEFT OUTER JOIN (
    SELECT 1 AS [test], [t1].[Id], [t1].[Username], ... 
    FROM [dbo].[User] AS [t1] 
    ) AS [t2] ON [t2].[Id] = [t0].[UserId] 

Dado que no todos client registros tienen un user registro que coincida, LINQ es la creación de una consulta que asegura que no serán una fila llena de nulos por cada client sin usuario. Esto se hace creando una columna ficticia adicional llamada [test].

Por lo tanto, las filas que tienen el valor de columna [test] establecido en 1 están realmente conectadas a la entidad user.

Supongo que esta columna [test] es utilizada por LINQ como una bandera que significa "hey, aquí hay un cliente con usuario definido".

Si decido reescribir esta consulta, usaré la clave primaria user como indicador, pero parece que para LINQ es más fácil usar la columna [test].

+0

¡Gracias! ¡Este era un misterio que mis compañeros de trabajo y yo estábamos intentando descubrir! – Mobius

Cuestiones relacionadas