我有许多类似的EF5实体用于参考数据。例如:
ConsultationType实体
public class ConsultationType
{
public ConsultationType()
{
this.Appeals = new HashSet<Appeal>();
}
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<Appeal> Appeals { get; set; }
}
LawBranch实体
public class LawBranch
{
public LawBranch()
{
this.Appeals = new HashSet<Appeal>();
}
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<Appeal> Appeals { get; set; }
}
数据库上下文中的DbSet
public DbSet<LawBranch> LawBranches { get; set; }
public DbSet<ConsultationType> ConsultationTypes { get; set; }
如您所见,这些实体具有相似的属性Id
和Title
。
实际问题
我需要一个从数据库中提取数据并将其放入列表的函数。然后该函数将预定义对象作为此列表的第一个元素插入。
我的预定义对象:
private class PredefinedReferenceItem
{
public int Id { get; set; }
public string Title { get; set; }
public PredefinedReferenceItem()
{
this.Id = -1;
this.Title = "some text";
}
}
我的错误解决方案:
首先,我创建了描述参考实体
的接口IReference
public interface IReference
{
int Id { get; set; }
string Title { get; set; }
}
其次,我的参考实体实现了这个接口
public class ConsultationType : IReference { ... }
public class LawBranch: IReference { ... }
第三,我创建了函数
public IList<IReference> GetReferenceWithPredefinedItem<T>(DbSet<IReference> dbset)
{
var data = from a in dbset
orderby a.Title
select a;
var list = data.ToList();
list.Insert(0, new PredefinedReferenceItem());
return list;
}
但该函数在我的viewmodel中不起作用:
return GetReferenceWithPredefinedItem(dbContext.ConsultationTypes);
VS2012中的错误消息:
The type arguments for method 'Mjc.Client.ViewModels.ViewModelBase.GetReferenceWithPredefinedItem<T>(System.Data.Entity.DbSet<Mjc.Foundation.IReference>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
请帮我查找错误或指定正确的方向。
答案 0 :(得分:1)
您是新来更改GetReferenceWithPredefinedItem以使用泛型对通用类型T的IReference约束,该方法应如下所示:
public IList<T> GetReferenceWithPredefinedItem<T>(DbSet<T> dbset) where T:IReference
{
var data = from a in dbset
orderby a.Title
select a;
var list = data.ToList();
list.Insert(0, new PredefinedReferenceItem());
return list;
}
答案 1 :(得分:0)
alexandr-mihalciuc提供了正确的解决方案。我添加解决类型引用错误: 最终解决方案:
public List<TEntity> GetReferenceWithPredefinedItem<TEntity>(DbSet<TEntity> dbset) where TEntity : class, new(), IReference
{
var data = from a in dbset
orderby a.Title
select a;
var list = data.ToList();
list.Insert(0, new TEntity() { Id = -1, Title ="aefaef" });
return list;
}