Я пытаюсь создать выражение Linq, которое можно использовать для запроса дочерней сущности для родительских свойств (в данном случае сущности PATIENT), используя этот метод:
private IQueryable<LAB_ORDER> SelectFilter(string fieldName, string value)
{
var param = Expression.Parameter(typeof(PATIENT), "item");
var field = Expression.PropertyOrField(param, fieldName);
var search = Expression.Constant(value, typeof(string));
var body = Expression.Call(field, "Contains", null, search);
Expression<Func<LAB_ORDER, bool>> lambda;
if (String.IsNullOrEmpty(value))
{
lambda = x => true;
}
else
{
lambda = Expression.Lambda<Func<LAB_ORDER, bool>>(body, parm);
}
var linqFilter = from e in context.LAB_ORDERS select e;
return linqFilter.Where(lambda);
}
Похоже, что оно правильно строит выражение, но я получаю следующее исключение:
System.ArgumentException:
ParameterExpression типа 'ПАЦИЕНТ'
нельзя использовать для параметра делегата
типа LAB_ORDER '.
Хотя я могу без проблем использовать linqFilter.Where (x => x.PATIENT.LAST_NAME == "Smith"), но не могу использовать приведенное выше выражение, которое должно переводиться примерно так Как бы я исправить вышеприведенное выражение, чтобы исправить это? Я с нетерпением загружаю родительскую сущность дочерним объектом, так что это не проблема.
EDIT
Из ответа Андерса похоже, что мне нужно изменить лямбда-выражение на:
lambda = Expression.Lambda<Func<PATIENT, bool>>(body, parm);
Теперь, когда я пытаюсь его использовать, linqFilter. Где (лямбда) выдает мне ошибку компиляции "Нет подходящей перегрузки", что я понимаю, почему - linqFilter
"IQueryable<LAB_ORDER>", not "IQueryable<PATIENT>",
так как мне это сделать?
Чтобы подвести итог, остается только один вопрос - как создать Expression для родительских свойств?