[英]LINQ/Entity framework: parameterless constructor issue
为什么这会给我无参数的构造函数错误?
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 to Objects中,可以毫无问题地调用构造函数。 但在LINQ to Entities中,不能那样做。 框架首先创建实例本身(例如,它需要无参数构造函数),然后设置各个属性。 解决此问题的最简单方法是在调用select之前调用AsEnumerable()
。 这将实现数据,因此构造函数通过LINQ to Objects调用,而不是由Entity Framework处理。 像这样:
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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.