VahidN / EFSecondLevelCache.Core

Entity Framework Core Second Level Caching Library
Apache License 2.0
326 stars 51 forks source link

How to separate IQueryable With Key ? #56

Closed amirhossein-tohidi closed 4 years ago

amirhossein-tohidi commented 4 years ago

.NET Core SDK version: 2.2.7 Microsoft.EntityFrameworkCore version: 2.2.6 EFSecondLevelCache.Core version: 2.8.1



## Example code/Steps to reproduce:

IQueryable<OrderListDTO> AsNoTracking(IOrderedQueryable<OrderListDTO> OrderByDescending(
    source: IQueryable<OrderListDTO> Take(
        source: IQueryable<OrderListDTO> Skip(
            source: IQueryable<OrderListDTO> Select(
                source: IOrderedQueryable<OrderRM> OrderByDescending(
                    source: IQueryable<OrderRM> Where(
                        source: DbSet<OrderRM>, 
                        predicate: o => value(System.Collections.Generic.List`1[ADTN.Branding.Common.Enums.OrderStatus]).Contains(o.Status)
                    ), 
                    keySelector: o => o.ForDate
                ), 
                selector: o => new OrderListDTO() {Id = o.Id, Code = Convert(o.Code, Int64), Status = o.Status, StationCode = o.Station.Code, StationName = o.Station.Name, IsStatusChanged = o.IsStatusChanged, Date = o.Date.ToUnixTime(), ForDate = o.ForDate.ToUnixTime(), Description = o.Description, FuelPackage = new FuelPackageDTO() {Title = o.FuelPackage.Title, Quantity = o.FuelPackage.Quantity, Fuel = new FuelDTO() {Type = o.FuelPackage.Fuel.Type, Name = o.FuelPackage.Fuel.Name}}, Assignment = o.Assignments.Select(a => new AssignmentDTO() {Id = a.Id, SerialNo = a.SerialNo, DeliveryDate = a.DeliveryDate.ToUnixTime(), Date = a.Date.ToUnixTime(), Quantity = a.Quantity, PaymentType = a.PaymentType, BillAmount = a.BillAmount, IsConfirmed = a.IsConfirmed, AssignmentBankBillTotalAmount = a.AssignmentBankBills.Sum(c => c.Amount), IsMultiPrice = a.IsMultiPrice, AssignmentAdditionalInformations = value(AutoMapper.Mapper).Map(a.AssignmentAdditionalInformations), Fuel = new FuelDTO() {Type = o.FuelPackage.Fuel.Type, Name = o.FuelPackage.Fuel.Name}}).SingleOrDefault(), CMR = o.CMRs.Select(cmr => new CMRDTO() {Id = cmr.Id, SentDate = cmr.SentDate.ToUnixTime(), ReceivedDate = cmr.ReceivedDate.ToUnixTime(), IsMultiPrice = cmr.IsMultiPrice, CMRAdditionalInformations = value(AutoMapper.Mapper).Map(cmr.CMRAdditionalInformations)}).SingleOrDefault()}
            ), 
            count: 0), 
        count: 10), 
    keySelector: T => T.Date
));.Call Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.AsNoTracking(.Call System.Linq.Queryable.OrderByDescending(
        .Call System.Linq.Queryable.Take(
            .Call System.Linq.Queryable.Skip(
                .Call System.Linq.Queryable.Select(
                    .Call System.Linq.Queryable.OrderByDescending(
                        .Call System.Linq.Queryable.Where(
                            .Constant<Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[ADTN.Branding.ReadSide.Model.Entities.OrderRM]>(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[ADTN.Branding.ReadSide.Model.Entities.OrderRM]),
                            '(.Lambda #Lambda1<System.Func`2[ADTN.Branding.ReadSide.Model.Entities.OrderRM,System.Boolean]>)),
                        '(.Lambda #Lambda2<System.Func`2[ADTN.Branding.ReadSide.Model.Entities.OrderRM,System.DateTimeOffset]>)),
                    '(.Lambda #Lambda3<System.Func`2[ADTN.Branding.ReadSide.Model.Entities.OrderRM,ADTN.Branding.Common.DTOs.CustomDTOs.OrderListDTO]>))
                ,
                0),
            10),
        '(.Lambda #Lambda4<System.Func`2[ADTN.Branding.Common.DTOs.CustomDTOs.OrderListDTO,System.Int64]>)))

.Lambda #Lambda1<System.Func`2[ADTN.Branding.ReadSide.Model.Entities.OrderRM,System.Boolean]>(ADTN.Branding.ReadSide.Model.Entities.OrderRM $o)
{
    .Call ((.Constant<ADTN.Branding.ReadSide.Service.Services.OrderService+<>c__DisplayClass1_0>(ADTN.Branding.ReadSide.Service.Services.OrderService+<>c__DisplayClass1_0).filter.Constant<ADTN.Branding.ReadSide.Service.Services.OrderService+<>c__DisplayClass1_0>(ADTN.Branding.Common.CustomEntities.Filters.OrderListFilter)).OrderStatus).Contains($o.Status)
}

.Lambda #Lambda2<System.Func`2[ADTN.Branding.ReadSide.Model.Entities.OrderRM,System.DateTimeOffset]>(ADTN.Branding.ReadSide.Model.Entities.OrderRM $o)
{
    $o.ForDate
}

.Lambda #Lambda3<System.Func`2[ADTN.Branding.ReadSide.Model.Entities.OrderRM,ADTN.Branding.Common.DTOs.CustomDTOs.OrderListDTO]>(ADTN.Branding.ReadSide.Model.Entities.OrderRM $o)
{
    .New ADTN.Branding.Common.DTOs.CustomDTOs.OrderListDTO(){
        Id = $o.Id,
        Code = (System.Int64)$o.Code,
        Status = $o.Status,
        StationCode = ($o.Station).Code,
        StationName = ($o.Station).Name,
        IsStatusChanged = $o.IsStatusChanged,
        Date = .Call ADTN.Branding.Common.Extensions.DateExtensions.ToUnixTime($o.Date),
        ForDate = .Call ADTN.Branding.Common.Extensions.DateExtensions.ToUnixTime($o.ForDate),
        Description = $o.Description,
        FuelPackage = .New ADTN.Branding.Common.DTOs.FuelPackageDTO(){
            Title = ($o.FuelPackage).Title,
            Quantity = ($o.FuelPackage).Quantity,
            Fuel = .New ADTN.Branding.Common.DTOs.FuelDTO(){
                Type = (($o.FuelPackage).Fuel).Type,
                Name = (($o.FuelPackage).Fuel).Name
            }
        },
        Assignment = .Call System.Linq.Enumerable.SingleOrDefault(.Call System.Linq.Enumerable.Select(
                $o.Assignments,
                .Lambda #Lambda5<System.Func`2[ADTN.Branding.ReadSide.Model.Entities.AssignmentRM,ADTN.Branding.Common.DTOs.AssignmentDTO]>)
        ),
        CMR = .Call System.Linq.Enumerable.SingleOrDefault(.Call System.Linq.Enumerable.Select(
                $o.CMRs,
                .Lambda #Lambda6<System.Func`2[ADTN.Branding.ReadSide.Model.Entities.CMRRM,ADTN.Branding.Common.DTOs.CMRDTO]>))
    }
}

.Lambda #Lambda4<System.Func`2[ADTN.Branding.Common.DTOs.CustomDTOs.OrderListDTO,System.Int64]>(ADTN.Branding.Common.DTOs.CustomDTOs.OrderListDTO $T)
{
    $T.Date
}

.Lambda #Lambda5<System.Func`2[ADTN.Branding.ReadSide.Model.Entities.AssignmentRM,ADTN.Branding.Common.DTOs.AssignmentDTO]>(ADTN.Branding.ReadSide.Model.Entities.AssignmentRM $a)
{
    .New ADTN.Branding.Common.DTOs.AssignmentDTO(){
        Id = $a.Id,
        SerialNo = $a.SerialNo,
        DeliveryDate = .Call ADTN.Branding.Common.Extensions.DateExtensions.ToUnixTime($a.DeliveryDate),
        Date = .Call ADTN.Branding.Common.Extensions.DateExtensions.ToUnixTime($a.Date),
        Quantity = $a.Quantity,
        PaymentType = $a.PaymentType,
        BillAmount = $a.BillAmount,
        IsConfirmed = $a.IsConfirmed,
        AssignmentBankBillTotalAmount = .Call System.Linq.Enumerable.Sum(
            $a.AssignmentBankBills,
            .Lambda #Lambda7<System.Func`2[ADTN.Branding.ReadSide.Model.Entities.AssignmentBankBillRM,System.Decimal]>),
        IsMultiPrice = $a.IsMultiPrice,
        AssignmentAdditionalInformations = .Call (.Constant<ADTN.Branding.ReadSide.Service.Services.OrderService>(ADTN.Branding.ReadSide.Service.Services.OrderService).Mapper.Constant<ADTN.Branding.ReadSide.Service.Services.OrderService>(AutoMapper.Mapper)).Map($a.AssignmentAdditionalInformations)
        ,
        Fuel = .New ADTN.Branding.Common.DTOs.FuelDTO(){
            Type = (($o.FuelPackage).Fuel).Type,
            Name = (($o.FuelPackage).Fuel).Name
        }
    }
}

.Lambda #Lambda6<System.Func`2[ADTN.Branding.ReadSide.Model.Entities.CMRRM,ADTN.Branding.Common.DTOs.CMRDTO]>(ADTN.Branding.ReadSide.Model.Entities.CMRRM $cmr)
{
    .New ADTN.Branding.Common.DTOs.CMRDTO(){
        Id = $cmr.Id,
        SentDate = .Call ADTN.Branding.Common.Extensions.DateExtensions.ToUnixTime($cmr.SentDate),
        ReceivedDate = .Call ADTN.Branding.Common.Extensions.DateExtensions.ToUnixTime($cmr.ReceivedDate),
        IsMultiPrice = $cmr.IsMultiPrice,
        CMRAdditionalInformations = .Call (.Constant<ADTN.Branding.ReadSide.Service.Services.OrderService>(ADTN.Branding.ReadSide.Service.Services.OrderService).Mapper.Constant<ADTN.Branding.ReadSide.Service.Services.OrderService>(AutoMapper.Mapper)).Map($cmr.CMRAdditionalInformations)
    }
}

.Lambda #Lambda7<System.Func`2[ADTN.Branding.ReadSide.Model.Entities.AssignmentBankBillRM,System.Decimal]>(ADTN.Branding.ReadSide.Model.Entities.AssignmentBankBillRM $c)
{
    $c.Amount
};
VahidN commented 4 years ago

What's wrong? What's not working for you? What's the original query? How can I reproduce this?

amirhossein-tohidi commented 4 years ago

Yes , Its not working for me,My query should change with enum and return a first cache value

        if (filter.OrderStep.IsNotNull() && filter.OrderStatus.Any())
            query = query.Where(o => filter.OrderStatus.Contains(o.Status));

        if (filter.IsCompleted.IsNotNull() && filter.IsCompleted.Value)
            query = query.Where(o => o.Status == OrderStatus.Completed || o.Status == OrderStatus.SituationStatusesCompletedBySystem || o.Status == OrderStatus.SituationStatusesCompletedByPetroSadaf);

        if (filter.AssignmentSerialNo.IsNotNull())
            query = query.Where(o => o.Assignments.Any(a => a.SerialNo == filter.AssignmentSerialNo));

        if (filter.FuelTypeList.IsNotNull() && filter.FuelTypeList.Any())
            query = query.Where(o => filter.FuelTypeList.Any(ft => ft == o.FuelPackage.Fuel.Type));

        if (filter.FromDateTimeOffset.IsNotNull() || filter.ToDateTimeOffset.IsNotNull())
        {
            switch (filter.FilteredDateEnum)
            {
                case FilteredDate.ForDate:
                    if (filter.FromDateTimeOffset.IsNotNull()) query = query.Where(o => o.ForDate >= filter.FromDateTimeOffset);
                    if (filter.ToDateTimeOffset.IsNotNull()) query = query.Where(o => o.ForDate <= filter.ToDateTimeOffset);
                    break;
                case FilteredDate.AssignmentDate:
                    if (filter.FromDateTimeOffset.IsNotNull()) query = query.Where(o => o.Assignments.Any(a => a.Date >= filter.FromDateTimeOffset));
                    if (filter.ToDateTimeOffset.IsNotNull()) query = query.Where(o => o.Assignments.Any(a => a.Date <= filter.ToDateTimeOffset));
                    break;
                case FilteredDate.DeliveryDate:
                    if (filter.FromDateTimeOffset.IsNotNull()) query = query.Where(o => o.Assignments.Any(a => a.DeliveryDate >= filter.FromDateTimeOffset));
                    if (filter.ToDateTimeOffset.IsNotNull()) query = query.Where(o => o.Assignments.Any(a => a.DeliveryDate <= filter.ToDateTimeOffset));
                    break;
                case FilteredDate.ReceivedByStationDate:
                    if (filter.FromDateTimeOffset.IsNotNull()) query = query.Where(o => o.CMRs.Any(a => a.ReceivedDate >= filter.FromDateTimeOffset));
                    if (filter.ToDateTimeOffset.IsNotNull()) query = query.Where(o => o.CMRs.Any(a => a.ReceivedDate <= filter.ToDateTimeOffset));
                    break;
            }
        }

        if (!UserResolver.HasAdminRole())
            query = query.Where(o => o.Station.StationPersonRoles.Any(owner => owner.Person.UserId == userId &&
                                                                               (owner.Role == StationRoles.Manager || owner.Role == StationRoles.Owner)));

        query = query.OrderByDescending(o => o.ForDate);

        var orderLists = query.Select(o => new OrderListDTO
        {
            Id = o.Id,
            Code = o.Code,
            Status = o.Status,
            StationCode = o.Station.Code,
            StationName = o.Station.Name,
            IsStatusChanged = o.IsStatusChanged,
            Date = o.Date.ToUnixTime(),
            ForDate = o.ForDate.ToUnixTime(),
            Description = o.Description,
            FuelPackage = new FuelPackageDTO
            {
                Title = o.FuelPackage.Title,
                Quantity = o.FuelPackage.Quantity,
                Fuel = new FuelDTO
                {
                    Type = o.FuelPackage.Fuel.Type,
                    Name = o.FuelPackage.Fuel.Name
                }
            },
            Assignment = o.Assignments.Select(a => new AssignmentDTO
            {
                Id = a.Id,
                SerialNo = a.SerialNo,
                DeliveryDate = a.DeliveryDate.ToUnixTime(),
                Date = a.Date.ToUnixTime(),
                Quantity = a.Quantity,
                PaymentType = a.PaymentType,
                BillAmount = a.BillAmount,
                IsConfirmed = a.IsConfirmed,
                AssignmentBankBillTotalAmount = a.AssignmentBankBills.Sum(c => c.Amount),
                IsMultiPrice = a.IsMultiPrice,
                AssignmentAdditionalInformations = Mapper.Map<List<AssignmentAdditionalInformationDTO>>(a.AssignmentAdditionalInformations),
                Fuel = new FuelDTO
                {
                    Type = o.FuelPackage.Fuel.Type,
                    Name = o.FuelPackage.Fuel.Name
                }

            }).SingleOrDefault(),

            CMR = o.CMRs.Select(cmr => new CMRDTO
            {
                Id = cmr.Id,
                SentDate = cmr.SentDate.ToUnixTime(),
                ReceivedDate = cmr.ReceivedDate.ToUnixTime(),
                IsMultiPrice = cmr.IsMultiPrice,
                CMRAdditionalInformations = Mapper.Map<List<CMRAdditionalInformationDTO>>(cmr.CMRAdditionalInformations)

            }).SingleOrDefault(),
        });

        orderLists = pageOptions.ApplyPaging(orderLists);
        orderLists = sortOptions.ApplyOrdering(orderLists);
        var efcdi = new EFCacheDebugInfo();

        var orders = await orderLists.Cacheable(efcdi).ToListAsync();
lock[bot] commented 4 years ago

This thread has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related problems.