linq到实体的转换问题

本文关键字:转换 问题 实体 linq | 更新日期: 2023-09-27 18:15:16

我试图以通用的方式过滤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;
}

基本上我试图过滤掉删除的实体(即。'Deleted'字段是'true'),当且仅当实体是可删除的(即它有'Deleted'字段)。问题是我不能强制转换IQueryable<返回到IQueryable> .

有什么办法解决这个问题吗?在你问:是的,这个方法必须是泛型的。

提前感谢!

linq到实体的转换问题

但是您可以使用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();
}

我可以这样解决我的问题:

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的灵感

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

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

作为奖励,您不需要强制转换任何内容或使用反射来测试IDeletable