2010-06-17 2 views
2

У меня есть IQueryable (PartHistories), который вернет набор объектов. У меня есть перечисление под названием «Фаза», которое изменяет запрос, например (rc - это список):делает «linq где» не разрешает свойства?

  var query = this.PartHistories; 
      if (Phase.Repair == _Phase) 
      { 
       query = query.Where(ph => ph.RemovedInRepair == false); 
      } 
      else 
      { 
       query = query.Where(ph => ph.PartPhaseID != (int)Phase.Repair); 
      } 
      rc.AddRange(query 
       .ToList()); 

Это работает.

Теперь объект, о котором идет речь (PartHistory), имеет свойство PartPhase, которое передает PartPhaseID как Phase. Этот код, однако, не работает (изменение в Phase.Repair линии):.

  var query = this.PartHistories; 
      if (Phase.Repair == _Phase) 
      { 
       query = query.Where(ph => ph.RemovedInRepair == false); 
      } 
      else 
      { 
       query = query.Where(ph => ph.PartPhase != Phase.Repair); 
      } 
      rc.AddRange(query 
       .ToList()); 

В AddRange, исключение «элемент„PartPhase“не поддерживается

Наконец, следующий код работает, но в данном случае, где расширение списка и (я думаю), применяется после того, как все PartHistories были собраны:

  if(Phase.Repair == _Phase) 
      { 
       rc.AddRange(this.PartHistories.ToList() 
        .Where(ph => ph.RemovedInRepair == false)); 
      } 
      else 
      { 
       rc.AddRange(this.PartHistories.ToList() 
        .Where(ph => ph.PartPhase != Phase.Repair)); 
+1

Вы верны в своем последнем примере кода, который работает после .ToList(). У меня никогда не было проблем с LINQ (для объектов, которые IEnumerable, а не IQueryable) и свойств. Так что проблема не выпрыгивает на меня. –

+0

Возможно, вы захотите дать нам более подробную информацию о том, как выглядят классы Phase и PartPhase. Является ли PartPhase тем же типом, что и Repair? –

+0

Фаза - это просто перечисление; PartPhase - это свойство PartHistory, которое возвращает int cast как Phase. Итак, да, PartPhase - это тот же тип, что и Repair; оба являются фазами. –

ответ

2

Если это Linq для SQL, то да, это делает не поддерживает пользовательские вызовы методов. Он может преобразовывать выражения в S QL, но не знает, что происходит внутри вашей собственности. Таким образом, пользовательские методы и свойства не конвертируются в SQL.

Если вы могли бы сделать Expression<Func<PartHistory, PartPhase>>, что бы сделать то же самое, что и ваша собственность (без вызова пользовательских методов), тогда это сработает.

+0

Это звучит как безопасное предположение – Marc

+0

Спасибо, Rotsor. Это имеет смысл (что SQL не понимает мое пользовательское свойство). Мне нужно изучить, как сделать выражение :), но на данный момент, я думаю, я не мог бы сделать намного лучше, чем код в первом примере. –

Смежные вопросы