Vra

In 'n LINQ na SQL-klas, hoekom is die eienskappe wat uit die vreemde sleutels geskep word EntitySet voorwerpe, wat implementeer IEnumerable, waar as die voorwerpe op die DataContext is Table voorwerpe wat implementeer IQueryable?

EDIT: Ter verduideliking, hier is 'n voorbeeld wat illustreer wat ek probeer verstaan.Hierdie voorbeeld:

ctx.Matches.Where(x => x.MatchID == 1).Single()
           .MatchPlayers.Max(x => x.Score);

tref die databasis twee keer waar as:

ctx.MatchPlayers.Where(x => x.MatchID == 1)
                .Max(x => x.Score);

voer slegs 1 navraag uit.Hier is die spore:

exec sp_executesql N'SELECT [t0].[MatchID], [t0].[Date]
FROM [dbo].[Matches] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go
exec sp_executesql N'SELECT [t0].[MatchID], [t0].[PlayerID], [t0].[Score]
FROM [dbo].[MatchPlayers] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go

en

exec sp_executesql N'SELECT MAX([t0].[Score]) AS [value]
FROM [dbo].[MatchPlayers] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go

wat ook wys dat, nog erger, die maksimum op die C#-vlak eerder as in die databasis gedoen word.

Ek weet dat die rede waarom dit gebeur die verskil is tussen IQueryables en IEnumerables, so hoekom nie die MatchPlayers objek in die eerste voorbeeld implementeer die IQueryable koppelvlak om dieselfde voordele as laasgenoemde voorbeeld te kry.

Was dit nuttig?

Oplossing

Tabelle is effektief 'n konseptuele saak - hulle bestaan ​​werklik op die bediener, so jy moet navraag doen om inskrywings te kry.Die vreemde sleutelinskrywings is dié wat eintlik deur 'n ander navraag gehaal word, so op daardie stadium is hulle plaaslik beskikbaar.Dit is 'n taamlik wollerige beskrywing, maar hopelik kom dit oor die algemene konsep.

Ander wenke

ctx.Matches.Where(x => x.MatchID == 1).Single()

Enkellopend () gee terug 'n wedstryd, nie 'n IQueryable (Match).

stoot Net Enkellopend () af tot die laaste stap:

ctx.Matches
  .Where(m => m.MatchID == 1)
  .Select(m => m.MatchPlayers.Max(mp => mp.Score))
  .Single();

Wat hierdie navraag toon is, dat dit OK is om die eiendom MatchPlayers gebruik in 'n navraag. Wat fokus op my interpretasie van die vraag die vraer se - "Hoekom kan ek nie 'n EntitySet gebruik in 'n navraag?", Kan jy

.

Dit was aangespreek op die MSDN forums . Die kern van die redenasie is dat dit baie moeilik is om bygevoeg en verwyder voorwerpe op te spoor, terwyl die maak van navrae teen die databasis. In plaas daarvan, die EntitySet is iets van 'n plaaslike kopie van die verwante voorwerpe wat jy kan manipuleer. Ongelukkig, as jy al agtergekom, dit het die newe-effek van die afwenteling uitdrukkings in LINQ om voorwerpe noem in plaas van die beter presterende LINQ na SQL.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top