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>
有什么办法解决这个问题吗?在你问:是的,这个方法必须是泛型的。
提前感谢!
但是您可以使用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