LINQ/实体框架:无参数构造函数问题

本文关键字:参数 构造函数 问题 实体 框架 LINQ | 更新日期: 2023-09-27 18:30:34

为什么这给了我无参数构造器错误?

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中仅支持无参数构造函数和初始值设定项。

LINQ/实体框架:无参数构造函数问题

错误说明了一切。在 LINQ to Object 中,可以毫无问题地调用构造函数。但在 LINQ to Entities 中,无法做到这一点。框架的工作原理是首先创建实例本身(例如,它需要无参数构造函数),然后设置各个属性。解决此问题的最简单方法是在调用 select 之前调用AsEnumerable()。这将具体化数据,以便通过 LINQ to Objects 调用构造函数,而不是由实体框架处理。喜欢这个:

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

第一个示例使用 IQueryable<T> 作为ObservableCollection<T>的源序列。
由于它是 LINQ to Entities 查询,因此存在一些限制(使用无参数 ctor 或对象初始值设定项是其中的一些限制)。

第二个样本首先通过调用ToList()方法实现IQueryable<T>ToList() 之后,查询结果将在客户端具体化,并且您的代码可以使用 IEnumerable<T> 和 LINQ to Objects,这不像 LINQ to Entities 那样具有此类限制。因此,您可以调用非默认 ctor。