【发布时间】:2014-11-12 02:02:40
【问题描述】:
public class CoreEntity
{
public int Id { get; set; }
//some additional common fields like insertedBy, insertedAt etc
}
public interface IUniqueObject
{
Guid Uid { get; set; }
}
public class Tag : CoreEntity
{
public string TagName { get; set; }
}
public class ItemTags : CoreEntity
{
public Guid TaggedItemUid { get; set; }
public int TagId { get; set; }
}
public class Repository<T>
where T : CoreEntity
{
public DbSet<T> TheEntitySet { get; set; }
public DbSet<ItemTags> ItemTagSet { get; set; }
public IQueryable<T> AddTagsFilter(IQueryable<T> query, List<int> tags)
{
var ts = ItemTagSet;
if (typeof (T) is IUniqueObject)
{
query = query.Where(f => ts.Any(e => e.TaggedItemUid == ((IUniqueObject)f).Uid && tags.Contains(e.TagId));
}
return query;
}
}
//usage
public class Departman : CoreEntity, IUniqueObject
{
public Guid Uid { get; set; }
//some other fields
}
class Test
{
void xx()
{
var r = new Repository<Departman>();
}
}
为了解决问题,对这些类进行了简化,它们所做的比这里显示的要多得多。问题是 Linq to Entities 不允许强制转换 ((IUniqueObject)f).Uid。那么知道泛型类型 T 实现 IUniqueObject 接口,如何应用标签过滤器。我尝试将一些 GenericMethod 与“T2 where : CoreEntity, IUniqueObject”一起使用,但无论如何我无法将类型 T 转换为 T2 任何帮助表示赞赏。
【问题讨论】:
-
我的问题原来是一样的:stackoverflow.com/questions/8175134/…
-
这项工作:query = ((IQueryable
)query).Where(f => ts.Any(e => e.TaggedItemUid == f.Uid && tags.Contains(e. TagId))).Cast ();
标签: c# generics linq-to-entities