基于类型的实体框架通用查找

时间:2019-07-15 17:58:45

标签: c# entity-framework generics

我有一个包含许多表的数据库,这些表纯粹是只读的。它们都是2列:同一类型的ID和说明。

我想创建一个通用方法,将DbSet类型作为T并从适当的表返回标准的LookupModel类。

这就是我所拥有的:

    public List<LookupModel> GetLookupList<T>() where T : DbSet
    {
        try
        {
            using (var context = new TwoCEntities())
            {
                var rows = context.Set<T>();
                return rows.Select(row => new LookupModel
                {
                    Id = (int)row.GetType().GetProperty("Id").GetValue(row, null),
                    Description = row.GetType().GetProperty("Description").GetValue(row, null).ToString()
                }).ToList();
            }
        }
        catch (Exception e)
        {
            if (log.IsErrorEnabled) log.ErrorFormat("GetLookupList<{0}> raised exception {1} with message {2}", typeof(T), e.GetType(), e.Message);
            throw;
        }
    }

我的问题是打电话给我。无法编译:

var result =  lookupRepository.GetLookupList<DbSet<BedType>>();

我收到此错误

The type 'System.Data.Entity.DbSet<Repository.BedType>' cannot be used as type parameter 'T' in the generic type or method 'ILookupRepository.GetLookupList<T>()'. There is no implicit reference conversion from 'System.Data.Entity.DbSet<Repository.BedType>' to 'System.Data.Entity.DbSet'.

BedType在我的上下文中定义为

public virtual DbSet<BedType> BedType { get; set; }

有人可以建议我哪里出问题了吗?

1 个答案:

答案 0 :(得分:1)

您提供的代码嵌套DbSet

您显示的是解决T的问题:

context.Set<DbSet<BedType>>();

您的T必须是普通实体类。删除DbSet方法上的GetLookup通用约束,然后添加class一个。

public List<LookupModel> GetLookupList<T>() where T : class
{
    try
    {
        using (var context = new TwoCEntities())
        {
            var rows = context.Set<T>();
            return rows.Select(row => new LookupModel
            {
                Id = (int)row.GetType().GetProperty("Id").GetValue(row, null),
                Description = row.GetType().GetProperty("Description").GetValue(row, null).ToString()
            }).ToList();
        }
    }
    catch (Exception e)
    {
        if (log.IsErrorEnabled) log.ErrorFormat("GetLookupList<{0}> raised exception {1} with message {2}", typeof(T), e.GetType(), e.Message);
        throw;
    }
}

这将使您的类型变量T在方法中解析为以下内容。

context.Set<BedType>();

调用它时,请像这样使用它:

var result = lookupRepository.GetLookupList<BedType>();