У меня довольно сложный запрос Linq, который отлично работает в стандартном Linq. Однако мне нужно изменить способ построения запроса и в зависимости от выбора пользователя включить в запрос операторы 0:n «Или».
Итак, чтобы дать некоторый контекст, мой первоначальный запрос был построен следующим образом:
IQueryable<Booking> booking;
booking = (
from b in _context.Bookings
.Include(v => v.Vendor)
.Include(v => v.PurchaseOrder)
.ThenInclude(v => v.PurchaseOrderDestinations)
.Include(l => l.LineLevelBookings)
.Include(d => d.BookingDangerousGoods)
select b
);
if (searchModel.BookingStatusId != null)
{
booking = booking.Where(b => b.BookingStatusId == searchModel.BookingStatusId);
}
и у меня было бы несколько таких объектов, и объект booking постепенно уменьшался бы по мере удовлетворения каждого критерия.
Теперь у меня возникла ситуация, когда мне нужно это изменить, потому что запрос стал более сложным и «стандартный» linq уже недостаточно хорош.
Поэтому я пытаюсь использовать PredicateBuilder.
Я начинаю с:
var predicate = PredicateBuilder.New<Booking>(true);
и сейчас я строю предикат аналогичным образом, но он также включает в себя сложные части:
if (searchModel.PoNumber != null)
{
predicate = predicate.And(b => b.PoNumber.ToString().StartsWith(searchModel.PoNumber.ToString()));
}
Итак, теперь я нахожусь на этапе, когда в исходной строке мне нужно включить Vendor, PurchaseOrder и т. д.
И это мой камень преткновения.
Я пытаюсь :
booking = _context.Bookings
.Include(v => v.Vendor)
.Include(v => v.PurchaseOrder)
.ThenInclude(v => v.PurchaseOrderDestinations)
.Include(l => l.LineLevelBookings)
.Include(d => d.BookingDangerousGoods)
.AsExpandable()
.Where(t => predicate)
.ToList();
но предпишите красные линии с помощью:
Невозможно преобразовать лямбда-выражение в предполагаемый тип делегата, поскольку некоторые возвращаемые трипы в блоке не могут быть неявно преобразованы в тип возвращаемого делегата.





booking = _context.Bookings
.Include(v => v.Vendor)
.Include(v => v.PurchaseOrder)
.ThenInclude(v => v.PurchaseOrderDestinations)
.Include(l => l.LineLevelBookings)
.Include(d => d.BookingDangerousGoods)
.Where(predicate) // note that we don't use lambda here
.ToList();
Судя по моему опыту использования как в классическом EF, так и в EF Core, мне не нужно было использовать .AsExpandable() перед применением предиката.
Хорошо... Спасибо. Если я удалю .AsExpandable и оставлю Where без лямбды, все будет работать отлично.
Спасибо, никогда этим не пользовался, поэтому был немного не уверен. Я удалю .AsExpandable() из этого ответа, чтобы он стал правильным.
Если я удалю лямбду в предложении «Где», вся строка будет красной линией.