Пример #1
0
        /// <summary>
        /// Searches.
        /// </summary>
        /// <param name="set">The database set.</param>
        /// <param name="q">The query arguments.</param>
        /// <param name="mapQuery">The map query handler.</param>
        /// <param name="cancellationToken">The optional token to monitor for cancellation requests.</param>
        /// <returns>A collection of entity.</returns>
        public static async Task <CollectionResult <T> > SearchAsync <T>(DbSet <T> set, QueryData q, Action <QueryPredication <T> > mapQuery, CancellationToken cancellationToken = default) where T : BaseResourceEntity
        {
            if (set == null)
            {
                return(null);
            }
            if (q == null)
            {
                return(new CollectionResult <T>(await set.ListEntities(new QueryArgs()).ToListAsync(cancellationToken), 0));
            }
            if (q.Count == 1 && q.ContainsKey("id"))
            {
                var ids  = q.GetValues("id").Where(ele => !string.IsNullOrWhiteSpace(ele));
                var list = new List <T>();
                foreach (var id in ids)
                {
                    var entity = await set.GetByIdAsync(id, false, cancellationToken);

                    list.Add(entity);
                }

                var result = new CollectionResult <T>(list, 0, list.Count);
                return(result);
            }

            QueryArgs args = q;
            var       col  = set.ListEntities(args, l =>
            {
                var info = new QueryPredication <T>(l, q);
                mapQuery?.Invoke(info);
                return(info.Data);
            });

            if (col is null)
            {
                return(new CollectionResult <T>(null, args.Offset));
            }
            return(new CollectionResult <T>(await col.ToListAsync(cancellationToken), args.Offset));
        }