diff --git a/src/FasTnT.Application/Database/DataSources/Utils/QueryParameterExtensions.cs b/src/FasTnT.Application/Database/DataSources/Utils/QueryParameterExtensions.cs index 02cbb65f..9941ac81 100644 --- a/src/FasTnT.Application/Database/DataSources/Utils/QueryParameterExtensions.cs +++ b/src/FasTnT.Application/Database/DataSources/Utils/QueryParameterExtensions.cs @@ -79,4 +79,13 @@ public static Expression> OrElse(this Expression> { return Expression.Lambda>(Expression.OrElse(expr1.Body, Expression.Invoke(expr2, expr1.Parameters[0])), expr1.Parameters[0]); } + internal static IQueryable WhereIn(this IQueryable queryable, Expression> keySelector, IEnumerable values) + { + var method = values.GetType().GetMethod("Contains"); + var instance = Expression.Constant(values); + var expression = Expression.Call(instance, method, keySelector.Body); + var lambda = Expression.Lambda>(expression, keySelector.Parameters); + + return queryable.Where(lambda); + } } diff --git a/src/FasTnT.Application/Database/EpcisContext.cs b/src/FasTnT.Application/Database/EpcisContext.cs index 4e247ef5..0c5ba861 100644 --- a/src/FasTnT.Application/Database/EpcisContext.cs +++ b/src/FasTnT.Application/Database/EpcisContext.cs @@ -11,7 +11,7 @@ public class EpcisContext : DbContext { public EpcisContext(DbContextOptions options) : base(options) { - ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; + ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; } public IQueryable QueryEvents(IEnumerable parameters) diff --git a/src/FasTnT.Application/Handlers/DataRetrieverHandler.cs b/src/FasTnT.Application/Handlers/DataRetrieverHandler.cs index 4b4c7008..dfe51a60 100644 --- a/src/FasTnT.Application/Handlers/DataRetrieverHandler.cs +++ b/src/FasTnT.Application/Handlers/DataRetrieverHandler.cs @@ -22,7 +22,7 @@ public async Task> QueryEventsAsync(IEnumerable para new QueryParameter { Name = "nextPageToken", Values = ["0"] } }); - var maxEventCount = parameters.SingleOrDefault(x => x.Name == "maxEventCount")?.AsInt(); + var maxResults = parameters.LastOrDefault(x => x.Name == "maxEventCount")?.AsInt() ?? constants.Value.MaxEventsReturnedInQuery; var eventIds = await context .QueryEvents(userParameters.Union(parameters)) .Select(x => x.Id) @@ -32,16 +32,16 @@ public async Task> QueryEventsAsync(IEnumerable para { return []; } - if (eventIds.Count >= (maxEventCount ?? constants.Value.MaxEventsReturnedInQuery)) + if (eventIds.Count >= maxResults) { throw new EpcisException(ExceptionType.QueryTooLargeException, "Query returned too many results"); } var events = await context.Set() - .Where(x => eventIds.Contains(x.Id)) + .WhereIn(x => x.Id, eventIds) .ToListAsync(cancellationToken); - return [.. events.OrderBy(e => eventIds.IndexOf(e.Id))]; + return events.OrderBy(e => eventIds.IndexOf(e.Id)).ToList(); } public async Task> QueryMasterDataAsync(IEnumerable parameters, CancellationToken cancellationToken)