2010-04-21 8 views
5

Devo concatenare 2 query linq2sql e ho un problema in quanto la query 2 non restituisce lo stesso numero di colonne, ciò che è strano è dopo una .ToList() sulle query, possono concatre senza problemi.perché LINQ 2 SQL a volte aggiunge un campo come seleziona 1 come test, altri campi validi

La ragione è, per qualche motivo linq2sql, ho 2 più colonna chiamata di prova e test2 che provengono da 2 a sinistra outer join che linq2sql creare automaticamente, qualcosa come "selezionare 1 come test, TableFields"

C'è qualche buona ragione per quello? come rimuovere questo campo extra "1 come test"?

qui un paio di esempi di quello che sembra: google result for linq 2 sql "select 1 as test"

+0

perché un downvote? – Fredou

+0

L'ho visto, è strano, per quanto ne so non c'è nulla che tu possa fare al riguardo. Non l'ho mai visto causare problemi: dovresti pubblicare il codice effettivo che non funziona se interrompe la tua app. – Aaronaught

+0

purtroppo non riesco a pubblicare il codice effettivo che lo causa – Fredou

risposta

4

OK, facciamo assumendo abbiamo 2 tabelle: dbo.User e dbo.Client. Ogni può essere collegato (o meno) a user. Quindi i record client hanno un campo chiave nullable che identifica un user.

per la query:

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

LINQ produrrà qualcosa di simile 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] 

Dal momento che non tutti i client record hanno una corrispondenza user disco, LINQ è la creazione di una query che garantisce che non vi saranno una riga piena di valori null per ogni utente client. Questo viene fatto creando una colonna fittizia extra denominata [test].

Quindi le righe che hanno il valore di colonna [test] impostato su 1 sono realmente collegate all'entità user.

Suppongo che questa colonna [test] sia utilizzata da LINQ come un flag che significa "hey, ecco un client con utente definito".

Se decido di riscrivere questa query, userò la chiave primaria user come indicatore, ma sembra che per LINQ sia più facile utilizzare la colonna [test].

+0

Grazie! Questo era un mistero che i miei colleghi e io stavamo cercando di capire! – Mobius

Problemi correlati