/// <summary>
 /// Performs a database Get operation and returns the item that corresponds to the specified id.
 /// </summary>
 /// <param name="id">The id to find</param>
 /// <returns>The requested T object</returns>
 public async Task <T> FindById(string id)
 {
     if (_supportsLocalStore)
     {
         return(await TableLocal.LookupAsync(id));
     }
     else
     {
         return(await TableCloud.LookupAsync(id));
     }
 }
 /// <summary>
 /// Performs a database Get operation and returns all of the items included in the table.
 /// </summary>
 /// <returns></returns>
 public async Task <List <T> > FindAll()
 {
     if (_supportsLocalStore)
     {
         return(await TableLocal.ToListAsync());
     }
     else
     {
         return(await TableCloud.ToListAsync());
     }
 }
 /// <summary>
 /// Performs a database Delete operation.
 /// </summary>
 /// <param name="objectToDelete">The object to delete.</param>
 /// <returns></returns>
 public async Task Delete(T objectToDelete)
 {
     if (_supportsLocalStore)
     {
         await TableLocal.DeleteAsync(objectToDelete);
     }
     else
     {
         await TableCloud.DeleteAsync(objectToDelete);
     }
 }
 /// <summary>
 /// Performs a database Update operation.
 /// </summary>
 /// <param name="objectToUpdate">The object to update.</param>
 /// <returns></returns>
 public async Task Update(T objectToUpdate)
 {
     if (_supportsLocalStore)
     {
         await TableLocal.UpdateAsync(objectToUpdate);
     }
     else
     {
         await TableCloud.UpdateAsync(objectToUpdate);
     }
 }
 /// <summary>
 /// Performs a database Insert operation.
 /// </summary>
 /// <param name="objectToSave">The object to save.</param>
 /// <returns></returns>
 public async Task Insert(T objectToSave)
 {
     if (_supportsLocalStore)
     {
         await TableLocal.InsertAsync(objectToSave);
     }
     else
     {
         await TableCloud.InsertAsync(objectToSave);
     }
 }
        /// <summary>
        /// Performs a database Get operation and returns all of the items that correspond to the specified predicate.
        /// </summary>
        /// <param name="predicate">The predicate to use.</param>
        /// <param name="criteria">The criteria for the where clause.</param>
        /// <returns>The list of T objects matching the predicate or the criteria</returns>
        public async Task <List <T> > FindAll(Expression <Func <T, bool> > predicate, Dictionary <string, object> criteria = null)
        {
            if (_supportsLocalStore)
            {
                if (Application.platform == RuntimePlatform.IPhonePlayer)
                {
                    if (PredicateCanRunAsSql(predicate.Body.ToString()) && criteria != null)
                    {
                        return(FindAllSql(criteria));
                    }
                }

                return(await TableLocal.Where(predicate).ToListAsync());
            }
            else
            {
                return(await TableCloud.Where(predicate).ToListAsync());
            }
        }