24

我有许多实体框架表,我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

4

1 回答 1

46

rec.ActiveTo指在您的界面中定义的属性。因此,Linq 需要先rec转换为IHistoricEntity才能访问该属性。

不要被 中引发的异常所迷惑.ToList():Linq 查询仅在需要记录时才被评估和执行,在这种情况下,当集合被转换为List<>.

更新:我验证了@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)))
于 2012-12-04T11:15:36.673 回答