演员在哪里? LINQ to Entities仅支持转换实体数据模型基元类型
我有许多entity framework表,我已经使用他们的IHistoricEntity
类支持IHistoricEntity
接口。 IHistoricEntity
有ActiveTo
Datetime?
属性。
// Auto generated LINQ to Entities domain service: [EnableClientAccess()] public partial class ProductService : LinqToEntitiesDomainService { public IQueryable GetANALYSIS_CODES() { return this.ObjectContext.ANALYSIS_CODES; } ... } // My Partial class to add interface public partial class ANALYSIS_CODES : IHistoricEntity {}
我试图将这个工作代码重构为一个方法:
List filtered = (from rec in ps.GetANALYSIS_CODES() where rec.ActiveTo == null select rec).ToList()
像这样:
private List Filter(IQueryable queryable) where T : IHistoricEntity { return (from rec in queryable where rec.ActiveTo == null select rec).ToList(); } // called like this: List filtered = Filter(ps.GetANALYSIS_CODES());
这在ToList
上给出了这个例外:
无法将“ANALYSIS_CODES”类型强制转换为“IHistoricEntity”类型。 LINQ to Entities仅支持转换实体数据模型基元类型。
但是我在哪里要求它投射到IHistoricEntity
? 我已经说过T
必须支持IHistoricEntity
。
rec.ActiveTo
指的是界面中定义的属性。 因此,Linq需要在能够访问该属性之前将rec
为IHistoricEntity
。
不要被.ToList()
引发的exception所.ToList()
:只有在需要记录时才会评估和执行Linq查询,在这种情况下,当要将集合转换为List<>
。
更新 :我validation了@ hvd的评论,实际上,添加了一个where T: class
子句更改了Linq表达式
System.Collections.Generic.List`1[MyType] .Where(x => (Convert(x).ActiveTo == Convert(null)))
至
System.Collections.Generic.List`1[MyType] .Where(x => (x.ActiveTo == Convert(null)))