anchor.diff:         for i := pageStart to pageEnd do begin
            ADataTable.Rows[j] := TDataRow.New(FClassID, ADataTable.Columns);
            DehydrateItem( data[i], ADataTable.Rows[j]);
  -         ADataTable.Rows[j].__KEY := GetEntityKey(data[i]);
            inc(j)
          end;
        end;
  
positive.code:       FClassID : PtrInt;
      protected
        function GetNullPolicy(const AFilter : TColumnFilter) : TSortNullPolicy; virtual;
        function GetItemDisposePolicy : TDisposePolicy; virtual; abstract;
        function GetColumns : TDataColumns; virtual; abstract;
        function ApplyColumnSort(constref Left, Right : T; constref AFilter: TColumnFilter) : Integer; virtual;
        function ApplyColumnFilter(constref AItem: T; constref AFilter: TColumnFilter) : boolean; virtual;
        function GetItemField(constref AItem: T; const ABindingName : AnsiString) : Variant; virtual; abstract;
        procedure DehydrateItem(constref AItem: T; var ADataRow: Variant);
        function FetchPage(constref AParams: TPageFetchParams; var ADataTable: TDataTable): TPageFetchResult;
        function GetEntityKey(constref AItem: T) : Variant; virtual;
        procedure OnBeforeFetchAll(constref AParams: TPageFetchParams); virtual;
        procedure FetchAll(const AContainer : TList<T>); virtual; abstract;
        procedure OnAfterFetchAll(constref AParams: TPageFetchParams); virtual;
  
negative.code:   end else Result := false;
  end;
  
  function TCustomDataSource<T>.FetchPage(constref AParams: TPageFetchParams; var ADataTable: TDataTable): TPageFetchResult;
  var
    i, j : SizeInt;
  