2010-04-21 3 views
5

Ich habe 2 linq2sql Abfrage concat und ich habe ein Problem, da die 2 Abfrage nicht die gleiche Anzahl von Spalten zurückgibt, was seltsam ist Nach einer .ToList() auf die Abfragen können sie ohne Probleme concat.warum LINQ 2 SQL manchmal ein Feld wie 1 als Test, andere gültige Felder hinzufügen

Der Grund ist, aus irgendeinem linq2sql Grund, ich habe 2 weitere Spalte mit dem Namen Test und Test2, die 2 kommen äußere dass linq2sql automatisch verbinden links erstellen, so etwas wie „wählen 1 als Test, Tabellenfelder“

Gibt es dafür einen guten Grund? Wie entferne ich dieses zusätzliche Feld "1 als Test"?

hier einige Beispiele dafür, was es wie folgt aussehen: google result for linq 2 sql "select 1 as test"

+0

Warum ein Downvote? – Fredou

+0

Ich habe es gesehen, es ist komisch, soweit ich weiß, gibt es nichts, was man dagegen tun kann. Ich habe nie gesehen, dass es Probleme verursacht hat - Sie sollten den tatsächlichen Code posten, der versagt, wenn er Ihre App kaputt macht. – Aaronaught

+0

Leider kann ich den eigentlichen Code, der das verursacht, nicht posten – Fredou

Antwort

4

OK, lassen Sie uns unter der Annahme, wir haben 2 Tische: dbo.User und dbo.Client. Jeder client kann mit user verbunden sein (oder nicht). So haben client Datensätze ein Nullable-Fremdschlüsselfeld, das eine user identifiziert.

Für die Abfrage:

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] 

Da nicht alle client Datensätze haben einen passenden user Datensatz, LINQ eine Abfrage erstellen, die es wird gewährleistet werden:

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

LINQ etwas ähnliches produzieren eine Reihe voller Nullen für jeden Userless client. Dies geschieht, indem eine zusätzliche Dummy-Spalte namens [test] erstellt wird.

Also Zeilen, die [test] Spaltenwert auf 1 gesetzt haben, sind wirklich mit user Einheit verbunden.

Ich nehme an, dass [test] Spalte von LINQ als Flag verwendet wird, das bedeutet "Hey, hier ist ein Client mit benutzerdefinierten".

Wenn ich beschließe, diese Abfrage neu zu schreiben, verwende ich user Primärschlüssel als Indikator, aber es scheint für LINQ ist es einfacher, [test] Spalte zu verwenden.

+0

Danke! Dies war ein Geheimnis, das meine Mitarbeiter und ich versuchten herauszufinden! – Mobius

Verwandte Themen