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