来自类似实体的通用数据获取器

时间:2013-09-05 10:54:53

标签: c# entity-framework-5

我有许多类似的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; }

如您所见,这些实体具有相似的属性IdTitle

实际问题

我需要一个从数据库中提取数据并将其放入列表的函数。然后该函数将预定义对象作为此列表的第一个元素插入。

我的预定义对象:

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.

请帮我查找错误或指定正确的方向。

2 个答案:

答案 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;
}