2014-11-17 2 views
2

Почему это дает мне ошибку без параметров?LINQ/Entity framework: проблема с параметрическим конструктором

ObservableCollection<ArchivioErogazioniForList> tempHP = new ObservableCollection<ArchivioErogazioniForList>(); 

var erogazioniFiltrate = from r in MainWindow.dbContext.ArchivioErogazioni 
          where termToFind.Contains(r.IDTER.Value) && r.DATA_EROG >= test 
          select r; 
tempHP = new ObservableCollection<ArchivioErogazioniForList>(erogazioniFiltrate.Where(x => x.DATA_EROG >= test).Select(x => new ArchivioErogazioniForList(x))); 

В то время как это работает?

private ObservableCollection<ArchivioErogazioniForList> p_ListaMonitorErogazioni2; 
public ObservableCollection<ArchivioErogazioniForList> ListaMonitorErogazioni2 
{ 
    get { return p_ListaMonitorErogazioni2; } 
    set { 
     p_ListaMonitorErogazioni2 = value; 
     base.RaisePropertiesChanged("ListaMonitorErogazioni2"); 
    } 
} 

allRecords = (from r in MainWindow.dbContext.ArchivioErogazioni select r).ToList(); 

ListaMonitorErogazioni2 = new ObservableCollection<ArchivioErogazioniForList>(allRecords.Where(x => x.DATA_EROG >= startDate && x.DATA_EROG <= endDate).Select(x => new ArchivioErogazioniForList(x))); 

В чем разница? Первый фрагмент даст мне ошибку «System.NotSupportedException: в LINQ to Entities поддерживаются только конструкторы и инициализаторы без параметров».

ответ

8

Ошибка говорит все. В LINQ to Objects конструкторы могут быть вызваны без проблем. Но в LINQ to Entities это невозможно. Каркас работает, сначала создавая сам экземпляр (например, он нуждается в конструкторе без параметров), а затем устанавливает индивидуальные свойства. Самый простой способ решить это - позвонить AsEnumerable() перед вызовом select. Это материализует данные, поэтому конструктор вызывается через LINQ для объектов вместо обработки Entity Framework. Как это:

erogazioniFiltrate.Where(x => x.DATA_EROG >= test).AsEnumerable().Select(x => new ArchivioErogazioniForList(x)) 
1

Первый образец использует IQueryable<T> в качестве исходной последовательности для ObservableCollection<T>.
Поскольку это запрос LINQ to Entities, есть некоторые ограничения (некоторые из них - использование без параметров ctor или инициализатор объекта).

Второй образец впервые материализуется IQueryable<T> по телефону ToList() метод. После ToList() результаты запроса материализуются на стороне клиента, а ваш код работает с IEnumerable<T> и LINQ to Objects, у которых нет таких ограничений, как LINQ to Entities. Следовательно, вы можете позвонить не по умолчанию ctor.

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