Beispiel #1
0
        private IDatabaseExpression GetFilterString(IDatabaseExpression sql)
        {
            var groupFilter = (this.Library.IsGroupingEnabled)
                ? DatabaseExpression.Or(
                DatabaseExpression.IsTrue(nameof(Record.IsGroup)),
                DatabaseExpression.IsNull(nameof(Record.GroupKey)))
                : DatabaseExpression.IsFalse(nameof(Record.IsGroup));

            var filter = (sql != null)
                ? DatabaseExpression.And(groupFilter, sql)
                : groupFilter;

            return(filter);
        }
Beispiel #2
0
        /// <summary>
        /// 指定タグを含まないアイテムをカウント
        /// </summary>
        /// <param name="connection"></param>
        /// <param name="items"></param>
        /// <param name="bufferLength"></param>
        /// <param name="filter"></param>
        /// <returns></returns>
        private async Task <long> CountItemsWithoutTag
            (IDbConnection connection, IEnumerable <string> items, int bufferLength, IDatabaseExpression filter)
        {
            foreach (var ids in items.Buffer(bufferLength))
            {
                var param = new Tuple <string[]>(ids.ToArray());

                var woTag = await this.Table.CountAsync(connection, filter, param);

                if (woTag > 0)
                {
                    return(woTag);
                }
            }
            return(0);
        }
Beispiel #3
0
        /// <summary>
        /// 指定検索条件下でのインデックスを調べる
        /// </summary>
        /// <param name="criteria"></param>
        /// <param name="target"></param>
        /// <returns></returns>
        private async Task <long> FindIndexMainAsync
            (IDbConnection connection, ISearchCriteria criteria, IDatabaseExpression filterSql, Record target)
        {
            var sql = SortSetting.GetReferenceSelectorSql(criteria.GetSort());

            var reference = await this.Records
                            .GetDynamicParametersAsync(connection, sql, target)
                            .ConfigureAwait(false);

            if (reference == null)
            {
                return(-1);
            }

            var filter = DatabaseExpression.And(filterSql,
                                                SortSetting.GetOrderFilterSql(criteria.GetSort()));

            return((await this.Records.CountAsync(connection, filter, reference).ConfigureAwait(false)) - 1);
        }
Beispiel #4
0
        /// <summary>
        /// 検索
        /// </summary>
        /// <param name="filter"></param>
        /// <param name="sort"></param>
        /// <param name="skip"></param>
        /// <param name="take"></param>
        /// <returns></returns>
        public async Task <Record[]> SearchMainAsync
            (IDatabaseExpression filter, string[] sort, long skip, long take, object param = null)
        {
            Record[] records = null;

            using (var connection = await this.Database.ConnectAsync().ConfigureAwait(false))
            {
                records = await this.Records
                          .AsQueryable(connection)
                          .Where(filter)
                          .OrderBy(sort.Append(FileProperty.Id.ToSort(false)).ToArray())
                          .Skip(skip)
                          .Take(take)
                          .ToArrayAsync(param)
                          .ConfigureAwait(false);
            }

            foreach (var item in records)
            {
                this.RecordTracker.Track(item);
            }

            return(records);
        }
        /// <summary>
        /// Remove a lot of records
        /// </summary>
        /// <param name="connection"></param>
        /// <param name="ids"></param>
        public async Task RemoveRangeBufferedWithFilter
            (IDbConnection connection, IEnumerable <TKey> ids, IDatabaseExpression filter)
        {
            foreach (var buffer in ids.Distinct().Buffer(this.BufferSize))
            {
                using (var transaction = connection.BeginTransaction())
                {
                    try
                    {
                        var param = new Tuple <TKey[]>(buffer.ToArray());

                        await connection.ExecuteAsync
                            ($"DELETE FROM {this.Name} WHERE (({IdName} IN @{nameof(param.Item1)}) AND {filter.GetSql()})",
                            param, transaction).ConfigureAwait(false);

                        transaction.Commit();
                    }
                    catch
                    {
                        transaction.Rollback();
                    }
                }
            }
        }
Beispiel #6
0
        public async Task <string[]> GetRegionIdsMainAsync
            (IDbConnection connection, ISearchCriteria criteria, long index1, long index2, IDatabaseExpression filter)
        {
            if ((index1 < 0 && index2 < 0) ||
                (index1 < 0 || index1 == index2) ||
                (index2 < 0))
            {
                return(null);
            }

            var startIndex = index1;
            var endIndex   = index2;

            //var startRecord = record1;
            //var endRecord = record2;

            if (index2 < index1)
            {
                startIndex = index2;
                endIndex   = index1;
                //startRecord = record2;
                //endRecord = record1;
            }

            if (index2 - index1 == 1)
            {
                return(null);
            }

            var sort = SortSetting.GetFullSql(criteria.GetSort());

            return(await this.Records
                   .AsQueryable(connection)
                   .Where(filter)
                   .OrderBy(sort.Append(FileProperty.Id.ToSort(false)).ToArray())
                   .Select <string>(nameof(Record.Id))
                   .Skip(startIndex + 1)
                   .Take(endIndex - startIndex - 1)
                   .ToArrayAsync()
                   .ConfigureAwait(false));
        }
 public Task <TResult> MinAsync <TResult>
     (IDbConnection connection, string column, IDatabaseExpression whereSql, object parameter = null)
 {
     return(connection
            .ExecuteScalarAsync <TResult>($@"SELECT MIN({column}) FROM {this.Name} WHERE {whereSql.GetSql()}", parameter));
 }
 /// <summary>
 /// Count records with parameter
 /// </summary>
 /// <param name="connection"></param>
 /// <param name="sql"></param>
 /// <param name="parameter"></param>
 /// <returns></returns>
 public Task <long> CountAsync(IDbConnection connection, IDatabaseExpression sql, object parameter)
 {
     return(connection
            .ExecuteScalarAsync <long>($@"SELECT COUNT({IdName}) FROM {this.Name} WHERE {sql.GetSql()}", parameter));
 }
 /// <summary>
 /// Count records
 /// </summary>
 /// <param name="connection"></param>
 /// <param name="sql"></param>
 /// <returns></returns>
 public long Count(IDbConnection connection, IDatabaseExpression sql)
 {
     return(connection
            .ExecuteScalar <long>($@"SELECT COUNT({IdName}) FROM {this.Name} WHERE {sql.GetSql()}"));
 }
Beispiel #10
0
 public TableQueryable <T> Where(IDatabaseExpression sql)
 {
     this.WhereSql = sql.GetSql();
     return(this);
 }