2017-08-15 1 views
0

Hier sind meine Tabellen:Warum fügt Linq-to-SQL unnötiges COUNT() hinzu?

create table customer 
(
    cid int primary key, 
    name varchar(32) 
) 

create table ord 
(
    oid int primary key, 
    cid int foreign key references customer, 
    address varchar(20) 
) 

Hier ist meine Linq-to-SQL-Anweisung:

var aaa = from c in db.Customer 
      select new { c, o = c.Ord.ToList() }; 

Und hier ist die unerklärliche Abfrage generiert durch Linq-to-SQL:

SELECT 
    [t0].[cid] AS [Cid], [t0].[name] AS [Name], [t1].[oid] AS [Oid], 
    [t1].[cid] AS [Cid2], [t1].[address] AS [Address], 
    (SELECT COUNT(*) 
    FROM [dbo].[ord] AS [t2] 
    WHERE [t2].[cid] = [t0].[cid]) AS [value] 
FROM [dbo].[customer] AS [t0] 
LEFT OUTER JOIN [dbo].[ord] AS [t1] ON [t1].[cid] = [t0].[cid] 
ORDER BY [t0].[cid], [t1].[oid] 

Ich möchte verstehen, wie man diesen COUNT(*) Teil loswird. Es ist völlig unangebracht!

+1

Möglicherweise verwandt? https://stackoverflow.com/questions/11997048/why-does-linq-2-sql-create-extra-uncesses-objects/12045296#12045296 – DenNukem

Antwort

1

LINQ benötigt die COUNT(*), um die Anzahl der Einträge zu bestimmen, die für die o = c.Ord.ToList() zurückgegeben werden.

+0

Warum gibt es solche Notwendigkeit? Könnten sie die Liste nicht einfach so erweitern, wie sie kommen? Das Problem, das ich habe, ist, dass diese Abfrage einen Abfrageplan erzeugt, der N^2 ist, wobei N die Anzahl der Bestellungen pro Kunde ist (was in meinem Fall groß ist). Ich bin ziemlich frustriert. Danke für deine Einsicht. – DenNukem

+0

Überlegen Sie, wie die SQL die Daten zurückgibt - Sie haben 't0' (Kunden) -Felder wiederholt mit jedem' t1' (ord) -Feld in einer flachen Liste von Datensätzen abgeglichen. (SQL gibt nur Tabellen zurück.) Irgendwie muss LINQ einen Kundendatensatz erstellen, der mit diesen Daten zusammengeführt wird. Die Verfügbarkeit der Zählung erleichtert dies erheblich. Ich sehe nicht, wie es anders gemacht werden kann, ohne die Datenbank pro Kunde nach den Ord-Datensätzen abzufragen. Ich nehme an, Sie verwenden Entity Framework? Was passiert, wenn Sie zu 'wechseln (von c in db.Customer wählen c) .Include (" ord ")'? – NetMage

+0

Es ist die alte Schule linq2sql, nicht EF. Ich stelle es mir so vor: LINQ liest eingehende Datensätze ein, und für jeden einzelnen erstellt es ein neues Customer-Objekt (falls nicht früher erstellt) und fügt dann den Bestellteil des Ergebnis-Rowsets zum entsprechenden Kunden hinzu (nach Kundennummer gesucht). . Es gibt keine Notwendigkeit zu wissen, wie viele Befehle du bekommst - häufe sie einfach weiter an, wenn sie reinkommen. – DenNukem

Verwandte Themen