/// <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)); }