Entity Framework e l'sql generato

di Andrea Zani, in .NET,

Una torna a casa per qualche giorno di ferie e si becca il maltempo. Qualcuno crede alla sfortuna, altri al destino... non me ne importa niente: il problema è che c'è brutto tempo!

Allora per ammazzare un po' il tempo prima di pranzo cosa c'è di meglio che giocare con leggerezza ancora con l'Entity Framework?

Dopo che nel post precedente ho fatto vedere un banale inserimento, ecco come visualizzare i dati inseriti:

using (TestEntitiesModel.TestEntitiesCode context = new TestEntitiesModel.TestEntitiesCode())
{
var coll = from t in context.Names.Include("Books")
select t;
gw1.DataSource = coll;
gw1.DataBind();
}

Sempre con la sintassi Linq, faccio una select del contenuto della Entity Names e con l'include, voglio anche che sia popolata la collection dei Books. Il GridView nel codice html è il seguente:

<asp:GridView ID="gw1" EnableViewState="false" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="Id" />
<asp:BoundField DataField="Names1" />
<asp:TemplateField>
<ItemTemplate>
<asp:GridView ID="gw_book" runat="server" DataSource='<%# Eval("Books") %>'>
</asp:GridView>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

Il risultato è il seguente:

result

Ma la mia grande curiosità è che comando sql è stato inviato a Sql Server. Armato di Profiler vado a curiosare e scopro una query alquanto bizzarra, almeno per me:

SELECT
[Project2].[Id] AS [Id],
[Project2].[Names] AS [Names],
[Project2].[C1] AS [C1],
[Project2].[C2] AS [C2],
[Project2].[Id1] AS [Id1],
[Project2].[Title] AS [Title]
FROM ( SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Names] AS [Names],
1 AS [C1],
[Project1].[Id] AS [Id1],
[Project1].[Title] AS [Title],
[Project1].[C1] AS [C2]
FROM [dbo].[Names] AS [Extent1]
LEFT OUTER JOIN (SELECT
[Extent2].[NamesId] AS [NamesId],
[Extent3].[Id] AS [Id],
[Extent3].[Title] AS [Title],
1 AS [C1]
FROM [dbo].[NamesBooks] AS [Extent2]
INNER JOIN [dbo].[Books] AS [Extent3] ON [Extent3].[Id] = [Extent2].[BooksId] ) AS [Project1] ON [Extent1].[Id] = [Project1].[NamesId]
) AS [Project2]
ORDER BY [Project2].[Id] ASC, [Project2].[C2] ASC

Ancora una volta avevo pensato male. Avevo immaginato che facesse una prima query e quindi n eventuali per la tebella figlia, e invece ha creato un unico comando con sotto query in modo molto furbo.

Il risultato della query lanciata così come appare è il seguente:

query result

E' lui da codice poi a fare il distict per la collection Names e con le colonne virtuali create, C1 e C2 utilizzate in caso di più tabelle figlie.

Mi piace l'Entity Framework. Ne so ben poco, ma mi piace!

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese