LINQ-TO-sql выражение для родительского объекта - PullRequest
1 голос
/ 03 марта 2010

Я пытаюсь создать выражение 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 для родительских свойств?

1 Ответ

2 голосов
/ 03 марта 2010

В следующем утверждении вы говорите, что создадите функцию, которая принимает аргумент LAB_ORDER и возвращает значение bool.

lambda = Expression.Lambda<Func<LAB_ORDER, bool>>(body, parm);

Однако переменная parm содержит ПАЦИЕНТА. Вам придется переписать выражение lambda, чтобы вместо него взять LAB_ORDER. Если я правильно понимаю ваши намерения, вы правильно выразите выражение

x => x.PATIENT.[fieldnName].Contains()

но вы создали выражение

x => x.[fieldName].Contains()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...