[英]Entity Framework Generic Lookup based on Type
我有一个包含许多表的数据库,这些表是纯粹的只读查找。 它们都是 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; }
有人可以建议我哪里出错了吗?
您提供的代码是嵌套DbSet
。
您所展示的是将T
解析为:
context.Set<DbSet<BedType>>();
你的T
需要是一个普通的实体类。 删除GetLookup
方法上的DbSet
泛型约束并添加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>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.