Linq запрос с Contains работает только с IQueryable во внешней переменной

Я использую Entity Framework с Linq to Entities, пытаюсь выбрать некоторые данные из моей базы данных. Когда я создаю Linq запрос, который использует метод IQueryable.Contains, он может фильтровать данные, только если я использую внешнюю переменную! Позвольте мне показать пример.

Этот блок кода, работает отлично:

var volumes = (from v in work.VolumeAdditiveRepository.All
             where v.AdditivesID == AdditivesID
             select v.MetricID);
var metrics =
    from m in work.MetricRepository.All
    where !volumes.Contains(m.ID)
    select m;

Если вы внимательно посмотрите, то увидите, что я использую переменную volumes внутри этого фрагмента, в условии where. Если я скопирую содержимое этой переменной и вставлю ее внутрь переменной metrics, что приведет к приведенному ниже коду, то возникнет ошибка: "Unable to create a constant value of type 'CalculadoraRFS.Models.Domain.VolumeAditivo'. В данном контексте поддерживаются только примитивные типы ('такие как Int32, String и Guid').".

var metrics =
    from m in work.MetricRepository.All
    where !(from v in work.VolumeAdditiveRepository.All
             where v.AdditivesID == AdditivesID
             select v.MetricID).Contains(m.ID)
    select m;

Как подстановка переменной может вызвать такую ошибку?! Я делаю (наверняка) что-то не так?
. Спасибо!


UPDATE:

На самом деле, я обнаружил, что проблема, похоже, в Repository Pattern или DbContext, как указал @jhamm. Сниппет ниже тоже не работает:

var query = from m in work._context.Metric
               where !(from v in work._context.VolumeAdditive
                       where v.AdditivesID == AdditivesID
                       select v.MetricID).Contains(m.ID)
               select m;

Но сниппет ниже работает. Я просто убрал контекст из класса UnitOfWork, хотя он там очень просто определен: public CalculadoraRFSContext _context = new CalculadoraRFSContext();.

var _context = new CalculadoraRFSContext();
var query = from m in _context.Metric
               where !(from v in _context.VolumeAdditive
                       where v.AdditivesID == AdditivesID
                       select v.MetricID).Contains(m.ID)
               select m;

Теперь я действительно запутался в этом материале! Разве это не должно было работать так, как ожидалось?!

7
задан tyron 7 October 2011 в 12:23
поделиться