我试图以通用方式过滤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;。
有关如何解决此问题的任何想法?在你问之前:是的,这个方法 是通用的。
提前致谢!
答案 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。