LINQ到实体的铸造问题

时间:2011-11-19 19:45:27

标签: c# casting linq-to-entities iqueryable

我试图以通用方式过滤LINQ到实体的查询,但我一直收到错误。这是一段代码:

private IQueryable<T> FilterDeletedEntities<T>(IQueryable<T> entities)
{
    if (typeof(IDeletable).IsAssignableFrom(typeof(T)))
    {
        var deletableEntities = (IQueryable<IDeletable>)entities;
        deletableEntities = deletableEntities.Where(entity => !entity.Deleted);
        entities = (IQueryable<T>)deletableEntities;
    }
    return entities;
}

基本上,我尝试过滤掉已删除的实体(即&#39;已删除&#39;字段为&#39; true&#39;),当且仅当实体是IDeletable(即它具有&#39;已删除&#39;字段)。问题是我无法投射IQueryable&lt; IDeletable&gt;回到IQueryable&lt; T&gt;。

有关如何解决此问题的任何想法?在你问之前:是的,这个方法 是通用的。

提前致谢!

3 个答案:

答案 0 :(得分:1)

但您可以使用Cast<T>()转换它。

 entities = deletableEntities.Cast<T>();

您也可以将它用于IDeletable,例如,

private IEnumerable<T> FilterDeletedEntities<T>(IQueryable<T> entities)
{
    if (typeof(IDeletable).IsAssignableFrom(typeof(T)))
    {
        return entities.ToList()
                       .Cast<IDeletable>()
                       .Where( e => !e.Deleted )
                       .Cast<T>();
    }
    return entities.ToList();
}

答案 1 :(得分:1)

我能够通过这样做来解决我的问题:

private IQueryable<T> FilterDeletedEntities<T>(IQueryable<T> entities)
{
    if (typeof(IDeletable).IsAssignableFrom(typeof(T)))
    {
        var deletableEntities = (IQueryable<IDeletable>)entities;
        return deletableEntities.Where(entity => !entity.Deleted).Cast<T>();
    }
    return entities;
}

感谢tvanfosson的灵感。

答案 2 :(得分:0)

如果您可以假设没有人需要使用未实现IDeletable的T调用此方法,则可以限制T:

private IQueryable<T> FilterDeletedEntities<T>(IQueryable<T> entities) where T : IDeletable

作为奖励,您不需要投射任何东西或使用反射来测试IDeletable。