C # Entity Framework LINQ to Entities, добавляющий параметрическое выражение WHERE под выражением SELECT - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь выбрать определенный тип свойства навигации, передав параметр Id в выражение WHERE, но происходит сбой со следующей ошибкой:

"переменная 'parkingLot" типа "X.Models.ParkingLot'ссылка из области видимости' ', но она не определена "

Из поиска S / O я понимаю (если я не ошибаюсь) LINQ to Entities не может понять выражения с функциональными телами.Итак, я хотел бы спросить, есть ли способ достижения этой функциональности.

В настоящее время я пытаюсь сделать;

Уровень BaseService содержит выражение функции SelectAsync> такое, что;

    public virtual async Task<List<TOut>> SelectAsync<TIn, TOut>(Expression<Func<TIn, TOut>> selector) 
        where TIn : class, IBaseModel
    {
        List<TOut> retVal;
        using (var dc = new TContext() { Configuration = { ProxyCreationEnabled = false, AutoDetectChangesEnabled = false, LazyLoadingEnabled = false } })
        {
            retVal = await dc.Set<TIn>().AsNoTracking().Select(selector).ToListAsync();
        }
        return retVal;
    }

Из Службы я вызываю связанные объекты;

    var parkingLots = await SelectAsync(ParkingLotResponse.ResponseSelectExpr);

ParkingLotResponse.ResponseSelectExpr:

    public class ParkingLotResponse
    {
        public int Id { get; set; }

        .
        .
        .

        public IEnumerable<ParkingLotServiceResponse> Services { get; set; }

        .
        .
        .

        public static Expression<Func<ParkingLot, ParkingLotResponse>> ResponseSelectExpr =
            parkingLot => new ParkingLotResponse()
            {
                Id = parkingLot.Id,
                .
                .
                .
                // If we use non-function bodied (which is right below this line), everything runs ok.
                // Services = parkingLot.Services.AsQueryable().Select(ParkingLotServiceResponse.ResponseSelectExpr),
                Services = parkingLot.Services.AsQueryable().Select(ParkingLotServiceResponse.ResponseSelectExprParkingLot(parkingLot.Id)), // This one is causing problem
                .
                .
                .
            };

    }

Где ParkingLotServiceResponse;

public class ParkingLotServiceResponse
{
    public int Id { get; set; }

    public IEnumerable<ParkingLotServiceFareResponse> ServiceFares { get; set; }

        // This one is ok but can not select related subitems, thus returns all subitems
    public static Expression<Func<ParkingService, ParkingLotServiceResponse>> ResponseSelectExpr =>
        parkingLotService => new ParkingLotServiceResponse()
        {
            Id = parkingLotService.Id,
            ServiceFares = parkingLotService.ServiceFares.AsQueryable()
            .Select(ParkingLotServiceFareResponse.ResponseSelectExpr).AsEnumerable()
        };

        // This one is causing problem
    public static Expression<Func<ParkingService, ParkingLotServiceResponse>> ResponseSelectExprParkingLot(Guid parkingLotId) =>
        parkingLotService => new ParkingLotServiceResponse()
        {
            Id = parkingLotService.Id,
            ServiceFares = parkingLotService.ServiceFares.AsQueryable()
                .Where(ParkingLotServiceFareResponse.WhereBelongsToParkingLot(parkingLotId))
                //.Where(plsf => plsf.ParkingLotId == parkingLotId) // -> this is not working either
                .Select(ParkingLotServiceFareResponse.ResponseSelectExpr).AsEnumerable()
        };

}

Где ParkingLotServiceFareResponse;

public class ParkingLotServiceFareResponse
{
    public string Description { get; set; }

    public decimal Price { get; set; }

    public static Expression<Func<ParkingLotServiceFare, ParkingLotServiceFareResponse>> ResponseSelectExpr =>
        parkingLotServiceFare => new ParkingLotServiceFareResponse()
        {
            Description = parkingLotServiceFare.Description,
            Price = parkingLotServiceFare.Price
        };

    public static Expression<Func<ParkingLotServiceFare, bool>> WhereBelongsToParkingLot(Guid parkingLotId) =>
        parkingLotServiceFare => parkingLotServiceFare.ParkingLotId.Equals(parkingLotId);

}

Любая помощь будет оценена.

Спасибо,

...