Я использую Entity Framework с Linq to Entities, пытаюсь выбрать некоторые данные из моей базы данных. Когда я создаю Linq запрос, который использует метод IQueryable
, он может фильтровать данные, только если я использую внешнюю переменную! Позвольте мне показать пример.
Этот блок кода, работает отлично:
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;
Теперь я действительно запутался в этом материале! Разве это не должно было работать так, как ожидалось?!