Я пытаюсь выбрать определенный тип свойства навигации, передав параметр 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);
}
Любая помощь будет оценена.
Спасибо,