【问题标题】:LinqToEntities Generic Classes and InterfaceLinqToEntities 泛型类和接口
【发布时间】: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 任何帮助表示赞赏。

【问题讨论】:

标签: c# generics linq-to-entities


【解决方案1】:

LinqToEntities 中的 Where 语句将转换为 SQL 语法。每条指令都必须可以翻译成 SQL——这意味着没有强制转换。仍在考虑更有用的答案。我认为您需要为不同的查询类型提供不同的功能,例如添加一个方法,如:

public IQueryable<T> AddTagsFilterToUniqueObject(IQueryable<T> query, 
                                   List<int> tags) where T : IUniqueObject 
{ 
    var ts = ItemTagSet;

    query = query.Where(f => ts.Any(e => e.TaggedItemUid == (f.Uid && tags.Contains(e.TagId));

    return query;
}

【讨论】:

  • 不,它没有。将 IUniqueObject 接口视为该表具有附加的 Guid 字段以及主键,并在访问文档、注释、标签等常见表时使用此 guid。
  • 在这种情况下,什么类 实现了IUniqueObject?
  • 我更新了问题,添加了一个实现 IUniqueObject 并从 CoreEntity 派生的示例 Departman 类。
猜你喜欢
  • 2016-10-16
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 2015-04-01
  • 2017-09-26
  • 1970-01-01
相关资源
最近更新 更多