﻿using System;
using System.Linq.Expressions;
using System.Threading.Tasks;

namespace Light.DataCore
{
    abstract partial class QueryBase<T> : IQuery<T> where T : class
    {
        public abstract double? AvgField(Expression<Func<T, short?>> field);

        public abstract double? AvgField(Expression<Func<T, int?>> field);

        public abstract double AvgField(Expression<Func<T, double>> field);

        public abstract double? AvgField(Expression<Func<T, long?>> field);

        public abstract double AvgField(Expression<Func<T, long>> field);

        public abstract double AvgField(Expression<Func<T, int>> field);

        public abstract decimal? AvgField(Expression<Func<T, decimal?>> field);

        public abstract decimal AvgField(Expression<Func<T, decimal>> field);

        public abstract double? AvgField(Expression<Func<T, float?>> field);

        public abstract double AvgField(Expression<Func<T, float>> field);

        public abstract double? AvgField(Expression<Func<T, double?>> field);

        public abstract double AvgField(Expression<Func<T, short>> field);

        public abstract int CountField(Expression<Func<T, byte>> field);

        public abstract int CountField(Expression<Func<T, sbyte>> field);

        public abstract int CountField(Expression<Func<T, short>> field);

        public abstract int CountField(Expression<Func<T, int>> field);

        public abstract int CountField(Expression<Func<T, long>> field);

        public abstract int CountField(Expression<Func<T, double>> field);

        public abstract int CountField(Expression<Func<T, float>> field);

        public abstract int CountField(Expression<Func<T, decimal>> field);

        public abstract int CountField(Expression<Func<T, DateTime>> field);

        public abstract int CountField(Expression<Func<T, DateTime?>> field);

        public abstract int CountField(Expression<Func<T, decimal?>> field);

        public abstract int CountField(Expression<Func<T, float?>> field);

        public abstract int CountField(Expression<Func<T, double?>> field);

        public abstract int CountField(Expression<Func<T, long?>> field);

        public abstract int CountField(Expression<Func<T, int?>> field);

        public abstract int CountField(Expression<Func<T, short?>> field);

        public abstract int CountField(Expression<Func<T, sbyte?>> field);

        public abstract int CountField(Expression<Func<T, byte?>> field);

        public abstract int CountField(Expression<Func<T, bool?>> field);

        public abstract int CountField(Expression<Func<T, bool>> field);

        public abstract int CountField(Expression<Func<T, string>> field);

        public abstract long LongCountField(Expression<Func<T, short?>> field);

        public abstract long LongCountField(Expression<Func<T, int?>> field);

        public abstract long LongCountField(Expression<Func<T, long>> field);

        public abstract long LongCountField(Expression<Func<T, long?>> field);

        public abstract long LongCountField(Expression<Func<T, double?>> field);

        public abstract long LongCountField(Expression<Func<T, float>> field);

        public abstract long LongCountField(Expression<Func<T, float?>> field);

        public abstract long LongCountField(Expression<Func<T, decimal?>> field);

        public abstract long LongCountField(Expression<Func<T, DateTime>> field);

        public abstract long LongCountField(Expression<Func<T, DateTime?>> field);

        public abstract long LongCountField(Expression<Func<T, decimal>> field);

        public abstract long LongCountField(Expression<Func<T, double>> field);

        public abstract long LongCountField(Expression<Func<T, int>> field);

        public abstract long LongCountField(Expression<Func<T, byte?>> field);

        public abstract long LongCountField(Expression<Func<T, sbyte>> field);

        public abstract long LongCountField(Expression<Func<T, sbyte?>> field);

        public abstract long LongCountField(Expression<Func<T, short>> field);

        public abstract long LongCountField(Expression<Func<T, bool?>> field);

        public abstract long LongCountField(Expression<Func<T, byte>> field);

        public abstract long LongCountField(Expression<Func<T, bool>> field);

        public abstract long LongCountField(Expression<Func<T, string>> field);

        public abstract long? LongSumField(Expression<Func<T, int?>> field);

        public abstract long LongSumField(Expression<Func<T, int>> field);

        public abstract long? LongSumField(Expression<Func<T, short?>> field);

        public abstract long LongSumField(Expression<Func<T, short>> field);

        public abstract float? MaxField(Expression<Func<T, float?>> field);

        public abstract decimal MaxField(Expression<Func<T, decimal>> field);

        public abstract decimal? MaxField(Expression<Func<T, decimal?>> field);

        public abstract DateTime? MaxField(Expression<Func<T, DateTime?>> field);

        public abstract DateTime MaxField(Expression<Func<T, DateTime>> field);

        public abstract float MaxField(Expression<Func<T, float>> field);

        public abstract int? MaxField(Expression<Func<T, int?>> field);

        public abstract long MaxField(Expression<Func<T, long>> field);

        public abstract long? MaxField(Expression<Func<T, long?>> field);

        public abstract double MaxField(Expression<Func<T, double>> field);

        public abstract double? MaxField(Expression<Func<T, double?>> field);

        public abstract short? MaxField(Expression<Func<T, short?>> field);

        public abstract int MaxField(Expression<Func<T, int>> field);

        public abstract short MaxField(Expression<Func<T, short>> field);

        public abstract DateTime? MinField(Expression<Func<T, DateTime?>> field);

        public abstract double MinField(Expression<Func<T, double>> field);

        public abstract double? MinField(Expression<Func<T, double?>> field);

        public abstract float MinField(Expression<Func<T, float>> field);

        public abstract float? MinField(Expression<Func<T, float?>> field);

        public abstract decimal MinField(Expression<Func<T, decimal>> field);

        public abstract int? MinField(Expression<Func<T, int?>> field);

        public abstract long MinField(Expression<Func<T, long>> field);

        public abstract long? MinField(Expression<Func<T, long?>> field);

        public abstract int MinField(Expression<Func<T, int>> field);

        public abstract short? MinField(Expression<Func<T, short?>> field);

        public abstract decimal? MinField(Expression<Func<T, decimal?>> field);

        public abstract DateTime MinField(Expression<Func<T, DateTime>> field);

        public abstract short MinField(Expression<Func<T, short>> field);

        public abstract double? SumField(Expression<Func<T, double?>> field);

        public abstract float? SumField(Expression<Func<T, float?>> field);

        public abstract decimal SumField(Expression<Func<T, decimal>> field);

        public abstract decimal? SumField(Expression<Func<T, decimal?>> field);

        public abstract float SumField(Expression<Func<T, float>> field);

        public abstract long SumField(Expression<Func<T, long>> field);

        public abstract long? SumField(Expression<Func<T, long?>> field);

        public abstract double SumField(Expression<Func<T, double>> field);

        public abstract int SumField(Expression<Func<T, int>> field);

        public abstract int? SumField(Expression<Func<T, int?>> field);

        public abstract int? SumField(Expression<Func<T, short?>> field);

        public abstract int SumField(Expression<Func<T, short>> field);

        public abstract int CountField(Expression<Func<T, ushort>> field);

        public abstract int CountField(Expression<Func<T, ushort?>> field);

        public abstract int CountField(Expression<Func<T, uint>> field);

        public abstract int CountField(Expression<Func<T, uint?>> field);

        public abstract int CountField(Expression<Func<T, ulong>> field);

        public abstract int CountField(Expression<Func<T, ulong?>> field);

        public abstract long LongCountField(Expression<Func<T, ushort>> field);

        public abstract long LongCountField(Expression<Func<T, ushort?>> field);

        public abstract long LongCountField(Expression<Func<T, uint>> field);

        public abstract long LongCountField(Expression<Func<T, uint?>> field);

        public abstract long LongCountField(Expression<Func<T, ulong>> field);

        public abstract long LongCountField(Expression<Func<T, ulong?>> field);

        public abstract uint SumField(Expression<Func<T, ushort>> field);

        public abstract uint? SumField(Expression<Func<T, ushort?>> field);

        public abstract ulong LongSumField(Expression<Func<T, ushort>> field);

        public abstract ulong? LongSumField(Expression<Func<T, ushort?>> field);

        public abstract uint SumField(Expression<Func<T, uint>> field);

        public abstract uint? SumField(Expression<Func<T, uint?>> field);

        public abstract ulong LongSumField(Expression<Func<T, uint>> field);

        public abstract ulong? LongSumField(Expression<Func<T, uint?>> field);

        public abstract ulong SumField(Expression<Func<T, ulong>> field);

        public abstract ulong? SumField(Expression<Func<T, ulong?>> field);

        public abstract double AvgField(Expression<Func<T, ushort>> field);

        public abstract double? AvgField(Expression<Func<T, ushort?>> field);

        public abstract double AvgField(Expression<Func<T, ulong>> field);

        public abstract double? AvgField(Expression<Func<T, ulong?>> field);

        public abstract ushort MaxField(Expression<Func<T, ushort>> field);

        public abstract ushort? MaxField(Expression<Func<T, ushort?>> field);

        public abstract uint MaxField(Expression<Func<T, uint>> field);

        public abstract uint? MaxField(Expression<Func<T, uint?>> field);

        public abstract ulong MaxField(Expression<Func<T, ulong>> field);

        public abstract ulong? MaxField(Expression<Func<T, ulong?>> field);

        public abstract ushort MinField(Expression<Func<T, ushort>> field);

        public abstract ushort? MinField(Expression<Func<T, ushort?>> field);

        public abstract uint MinField(Expression<Func<T, uint>> field);

        public abstract uint? MinField(Expression<Func<T, uint?>> field);

        public abstract ulong MinField(Expression<Func<T, ulong>> field);

        public abstract ulong? MinField(Expression<Func<T, ulong?>> field);

        public abstract double AvgField(Expression<Func<T, uint>> field);

        public abstract double? AvgField(Expression<Func<T, uint?>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, string>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, bool>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, bool?>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, byte>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, byte?>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, sbyte>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, sbyte?>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, short>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, short?>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, ushort>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, ushort?>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, int>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, int?>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, uint>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, uint?>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, long>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, long?>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, ulong>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, ulong?>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, double>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, double?>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, float>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, float?>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, decimal>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, decimal?>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, DateTime>> field);

        public abstract Task<int> CountFieldAsync(Expression<Func<T, DateTime?>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, string>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, bool>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, bool?>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, byte>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, byte?>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, sbyte>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, sbyte?>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, short>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, short?>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, ushort>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, ushort?>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, int>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, int?>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, uint>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, uint?>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, long>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, long?>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, ulong>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, ulong?>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, double>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, double?>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, float>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, float?>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, decimal>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, decimal?>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, DateTime>> field);

        public abstract Task<long> LongCountFieldAsync(Expression<Func<T, DateTime?>> field);

        public abstract Task<int> SumFieldAsync(Expression<Func<T, short>> field);

        public abstract Task<int?> SumFieldAsync(Expression<Func<T, short?>> field);

        public abstract Task<uint> SumFieldAsync(Expression<Func<T, ushort>> field);

        public abstract Task<uint?> SumFieldAsync(Expression<Func<T, ushort?>> field);

        public abstract Task<long> LongSumFieldAsync(Expression<Func<T, short>> field);

        public abstract Task<long?> LongSumFieldAsync(Expression<Func<T, short?>> field);

        public abstract Task<ulong> LongSumFieldAsync(Expression<Func<T, ushort>> field);

        public abstract Task<ulong?> LongSumFieldAsync(Expression<Func<T, ushort?>> field);

        public abstract Task<int> SumFieldAsync(Expression<Func<T, int>> field);

        public abstract Task<int?> SumFieldAsync(Expression<Func<T, int?>> field);

        public abstract Task<uint> SumFieldAsync(Expression<Func<T, uint>> field);

        public abstract Task<uint?> SumFieldAsync(Expression<Func<T, uint?>> field);

        public abstract Task<long> LongSumFieldAsync(Expression<Func<T, int>> field);

        public abstract Task<long?> LongSumFieldAsync(Expression<Func<T, int?>> field);

        public abstract Task<ulong> LongSumFieldAsync(Expression<Func<T, uint>> field);

        public abstract Task<ulong?> LongSumFieldAsync(Expression<Func<T, uint?>> field);

        public abstract Task<long> SumFieldAsync(Expression<Func<T, long>> field);

        public abstract Task<long?> SumFieldAsync(Expression<Func<T, long?>> field);

        public abstract Task<ulong> SumFieldAsync(Expression<Func<T, ulong>> field);

        public abstract Task<ulong?> SumFieldAsync(Expression<Func<T, ulong?>> field);

        public abstract Task<double> SumFieldAsync(Expression<Func<T, double>> field);

        public abstract Task<double?> SumFieldAsync(Expression<Func<T, double?>> field);

        public abstract Task<float> SumFieldAsync(Expression<Func<T, float>> field);

        public abstract Task<float?> SumFieldAsync(Expression<Func<T, float?>> field);

        public abstract Task<decimal> SumFieldAsync(Expression<Func<T, decimal>> field);

        public abstract Task<decimal?> SumFieldAsync(Expression<Func<T, decimal?>> field);

        public abstract Task<double> AvgFieldAsync(Expression<Func<T, short>> field);

        public abstract Task<double?> AvgFieldAsync(Expression<Func<T, short?>> field);

        public abstract Task<double> AvgFieldAsync(Expression<Func<T, ushort>> field);

        public abstract Task<double?> AvgFieldAsync(Expression<Func<T, ushort?>> field);

        public abstract Task<double> AvgFieldAsync(Expression<Func<T, int>> field);

        public abstract Task<double?> AvgFieldAsync(Expression<Func<T, int?>> field);

        public abstract Task<double> AvgFieldAsync(Expression<Func<T, uint>> field);

        public abstract Task<double?> AvgFieldAsync(Expression<Func<T, uint?>> field);

        public abstract Task<double> AvgFieldAsync(Expression<Func<T, long>> field);

        public abstract Task<double?> AvgFieldAsync(Expression<Func<T, long?>> field);

        public abstract Task<double> AvgFieldAsync(Expression<Func<T, ulong>> field);

        public abstract Task<double?> AvgFieldAsync(Expression<Func<T, ulong?>> field);

        public abstract Task<double> AvgFieldAsync(Expression<Func<T, double>> field);

        public abstract Task<double?> AvgFieldAsync(Expression<Func<T, double?>> field);

        public abstract Task<double> AvgFieldAsync(Expression<Func<T, float>> field);

        public abstract Task<double?> AvgFieldAsync(Expression<Func<T, float?>> field);

        public abstract Task<decimal> AvgFieldAsync(Expression<Func<T, decimal>> field);

        public abstract Task<decimal?> AvgFieldAsync(Expression<Func<T, decimal?>> field);

        public abstract Task<short> MaxFieldAsync(Expression<Func<T, short>> field);

        public abstract Task<short?> MaxFieldAsync(Expression<Func<T, short?>> field);

        public abstract Task<ushort> MaxFieldAsync(Expression<Func<T, ushort>> field);

        public abstract Task<ushort?> MaxFieldAsync(Expression<Func<T, ushort?>> field);

        public abstract Task<int> MaxFieldAsync(Expression<Func<T, int>> field);

        public abstract Task<int?> MaxFieldAsync(Expression<Func<T, int?>> field);

        public abstract Task<uint> MaxFieldAsync(Expression<Func<T, uint>> field);

        public abstract Task<uint?> MaxFieldAsync(Expression<Func<T, uint?>> field);

        public abstract Task<long> MaxFieldAsync(Expression<Func<T, long>> field);

        public abstract Task<long?> MaxFieldAsync(Expression<Func<T, long?>> field);

        public abstract Task<ulong> MaxFieldAsync(Expression<Func<T, ulong>> field);

        public abstract Task<ulong?> MaxFieldAsync(Expression<Func<T, ulong?>> field);

        public abstract Task<double> MaxFieldAsync(Expression<Func<T, double>> field);

        public abstract Task<double?> MaxFieldAsync(Expression<Func<T, double?>> field);

        public abstract Task<float> MaxFieldAsync(Expression<Func<T, float>> field);

        public abstract Task<float?> MaxFieldAsync(Expression<Func<T, float?>> field);

        public abstract Task<decimal> MaxFieldAsync(Expression<Func<T, decimal>> field);

        public abstract Task<decimal?> MaxFieldAsync(Expression<Func<T, decimal?>> field);

        public abstract Task<DateTime> MaxFieldAsync(Expression<Func<T, DateTime>> field);

        public abstract Task<DateTime?> MaxFieldAsync(Expression<Func<T, DateTime?>> field);

        public abstract Task<short> MinFieldAsync(Expression<Func<T, short>> field);

        public abstract Task<short?> MinFieldAsync(Expression<Func<T, short?>> field);

        public abstract Task<ushort> MinFieldAsync(Expression<Func<T, ushort>> field);

        public abstract Task<ushort?> MinFieldAsync(Expression<Func<T, ushort?>> field);

        public abstract Task<int> MinFieldAsync(Expression<Func<T, int>> field);

        public abstract Task<int?> MinFieldAsync(Expression<Func<T, int?>> field);

        public abstract Task<uint> MinFieldAsync(Expression<Func<T, uint>> field);

        public abstract Task<uint?> MinFieldAsync(Expression<Func<T, uint?>> field);

        public abstract Task<long> MinFieldAsync(Expression<Func<T, long>> field);

        public abstract Task<long?> MinFieldAsync(Expression<Func<T, long?>> field);

        public abstract Task<ulong> MinFieldAsync(Expression<Func<T, ulong>> field);

        public abstract Task<ulong?> MinFieldAsync(Expression<Func<T, ulong?>> field);

        public abstract Task<double> MinFieldAsync(Expression<Func<T, double>> field);

        public abstract Task<double?> MinFieldAsync(Expression<Func<T, double?>> field);

        public abstract Task<float> MinFieldAsync(Expression<Func<T, float>> field);

        public abstract Task<float?> MinFieldAsync(Expression<Func<T, float?>> field);

        public abstract Task<decimal> MinFieldAsync(Expression<Func<T, decimal>> field);

        public abstract Task<decimal?> MinFieldAsync(Expression<Func<T, decimal?>> field);

        public abstract Task<DateTime> MinFieldAsync(Expression<Func<T, DateTime>> field);

        public abstract Task<DateTime?> MinFieldAsync(Expression<Func<T, DateTime?>> field);
    }
}
