演员在哪里? LINQ to Entities仅支持转换实体数据模型基元类型

时间:2012-12-04 10:13:16

标签: c# entity-framework

我有许多实体框架表,我使用他们的parital类支持接口IHistoricEntityIHistoricEntity具有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

1 个答案:

答案 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)))