El monstruito no soy yo, es el SharePoint

El Blog de Luis Mañez, dedicado a tecnologías MS, principalmente SharePoint y Office 365

Office 365: Destripando LINQ to SharePoint si usamos paginación de elementos II (ahora con REST)

En un post de hace unos días os comentaba cómo funciona internamente SharePoint cuando usamos Linq to SharePoint y hacemos uso de la paginación de elementos en el propio Linq (con los métodos de Skip y Take).

En este post veremos qué pasa cuando hacemos uso de la API REST de listas.

Para los que no conozcáis que podemos hacer con REST a la hora de atacar listas, os dejo un par de referencias muy sencillitas, pero donde podemos ver muy claramente cómo empezar y sus beneficios:

Si queremos usar paginación en REST, lo haríamos de la siguiente forma:

http://team.server.lab/_vti_bin/ListData.svc/Questions?$skip=20&$top=20

Pues bien, si volvemos a usar el SQL Profiler para trazar el resultado de la SQL que genera SharePoint, nos encontramos con la misma SQL que si usamos Linq to SP:

   1: SELECT TOP(@NUMROWS) t1.[Type] AS c0, UserData.[tp_ContentTypeId], UserData.[ntext2], t1.[DirName] AS c9, UserData.[tp_ID], UserData.[tp_CopySource], UserData.[tp_Version], t1.[Id] AS c4, UserData.[float2], UserData.[tp_Editor] AS c8c7, UserData.[tp_Created], t1.[SortBehavior] AS c1, UserData.[tp_HasCopyDestinations], UserData.[tp_ModerationStatus], UserData.[tp_Level], UserData.[nvarchar1], UserData.[tp_UIVersionString], t1.[MetaInfo] AS c3, t1.[ScopeId] AS c5, UserData.[tp_Author] AS c6c7, UserData.[tp_HasAttachment], UserData.[tp_Modified], CASE WHEN DATALENGTH(t1.DirName) = 0 THEN t1.LeafName WHEN DATALENGTH(t1.LeafName) = 0 THEN t1.DirName ELSE t1.DirName + N''/'' + t1.LeafName END  AS c2, UserData.[float1] 
   2:  
   3: FROM AllUserData AS UserData WITH(INDEX=AllUserData_PK) 
   4: INNER JOIN Docs AS t1 WITH(NOLOCK) ON (UserData.[tp_RowOrdinal] = 0) AND (t1.SiteId=UserData.tp_SiteId) AND (t1.SiteId = @SITEID) AND (t1.ParentId = UserData.tp_ParentId) AND (t1.Id = UserData.tp_DocId) AND ( (UserData.tp_Level = 1) ) AND (t1.Level = UserData.tp_Level) AND (t1.IsCurrentVersion = 1) AND (t1.Level = 1 OR t1.Level =  2) AND (UserData.[tp_ListID] =@LISTID) AND (UserData.[tp_CalculatedVersion] = 0 ) AND (UserData.[tp_IsCurrentVersion] = CONVERT(bit,1) ) AND (UserData.[tp_DeleteTransactionId] = 0x ) 
   5:  
   6: WHERE (UserData.[tp_CalculatedVersion] = 0 ) AND (UserData.[tp_IsCurrentVersion] = CONVERT(bit,1) ) AND (UserData.[tp_DeleteTransactionId] = 0x ) AND (UserData.tp_ListID=@LISTID) AND ( (UserData.tp_Level = 1) ) AND (UserData.tp_SiteId=@SITEID) AND (UserData.tp_RowOrdinal=0) AND (t1.SiteId=@SITEID AND (t1.DirName=@DN OR t1.DirName LIKE @DNEL+N''/%'')) 
   7:  
   8: ORDER BY UserData.[tp_ID]  ASC  OPTION (FORCE ORDER, MAXDOP 1)', 
   9:  
  10: N'
  11: @LFFP uniqueidentifier, 
  12: @SITEID uniqueidentifier, 
  13: @DN nvarchar(4000), 
  14: @DNEL nvarchar(4000), 
  15: @LISTID uniqueidentifier, 
  16: @NUMROWS bigint, 
  17: @RequestGuid uniqueidentifier',00000000-0000-0000-0000-000000000000', FB8F2EA0-94D9-4848-AA89-C13AD67145B7', Lists/Questions', Lists/Questions', ADFE87E8-3F1E-46B1-B70F-B60557E3BE43', 26540A30-80DD-4283-8EC0-C9AF68126EAD'
  18:  
  19: @LFFP='
  20: @SITEID='
  21: @DN=N'
  22: @DNEL=N'
  23: @LISTID='
  24: @NUMROWS=2147483648, 
  25: @RequestGuid='

ahí tenemos el NUMROWS con ese número… tan largo.

Nada más, como veis, a la hora de usar REST, tampoco estamos optimizando la paginación, así que tenerlo en cuenta en vuestros desarrollos.

Saludos!!

Posted: 6/12/2011 20:01 por Luis Mañez | con no comments
Comparte este post: