sql >> Database teknologi >  >> RDS >> Sqlserver

LINQ til SQL Take w/o Skip Årsager Flere SQL-sætninger

Først - nogle begrundelser for Take-fejlen.

Hvis du bare tager , forespørgselsoversætteren bruger bare top. Top10 giver ikke det rigtige svar, hvis kardinalitet brydes ved at deltage i en børnesamling. Så forespørgselsoversætteren deltager ikke i børnesamlingen (i stedet forespørger den efter børnene).

Hvis du Spring og tag , så starter forespørgselsoversætteren med noget RowNumber-logik over forældrerækkerne... disse rækkenumre lader det tage 10 forældre, selvom det i virkeligheden er 50 poster, fordi hver forælder har 5 børn.

Hvis du springer over(0) og tager , Skip er fjernet som en ikke-operation af oversætteren - det er ligesom du aldrig sagde Skip.

Dette bliver et hårdt konceptuelt spring, hvorfra du er (kalder Skip and Take) til en "simpel løsning". Hvad vi skal gøre - er at tvinge oversættelsen til at ske på et punkt, hvor oversætteren ikke kan fjerne Skip(0) som en ikke-operation. Vi er nødt til at ringe til Skip og oplyse det oversprungne nummer på et senere tidspunkt.

DataClasses1DataContext myDC = new DataClasses1DataContext();
  //setting up log so we can see what's going on
myDC.Log = Console.Out;

  //hierarchical query - not important
var query = myDC.Options.Select(option => new{
  ID = option.ParentID,
  Others = myDC.Options.Select(option2 => new{
    ID = option2.ParentID
  })
});
  //request translation of the query!  Important!
var compQuery = System.Data.Linq.CompiledQuery
  .Compile<DataClasses1DataContext, int, int, System.Collections.IEnumerable>
  ( (dc, skip, take) => query.Skip(skip).Take(take) );

  //now run the query and specify that 0 rows are to be skipped.
compQuery.Invoke(myDC, 0, 10);
 

Dette frembringer følgende forespørgsel:

SELECT [t1].[ParentID], [t2].[ParentID] AS [ParentID2], ( SELECT COUNT(*) FROM [dbo].[Option] AS [t3] ) AS [value] FROM ( SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ID]) AS [ROW_NUMBER], [t0].[ParentID] FROM [dbo].[Option] AS [t0] ) AS [t1] LEFT OUTER JOIN [dbo].[Option] AS [t2] ON 1=1 WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p1 + @p2 ORDER BY [t1].[ROW_NUMBER], [t2].[ID] -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [0] -- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [0] -- @p2: Input Int (Size = 0; Prec = 0; Scale = 0) [10] -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1

Og det er her, vi vinder!

WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p1 + @p2
 


  1. Sådan ændres MySQL-serverens tidszone

  2. Monitoring Galera Cluster for MySQL eller MariaDB - Understanding Metrics (Opdateret)

  3. Enkelt citat, dobbelt citat og backticks i MySQL-forespørgsler

  4. Hvordan gendanner jeg en dump-fil fra mysqldump?