1

我的 SQL 数据库中有许多存储基本 KVP 数据的表。它们都有 Id(int)、Description(varchar(..)) 的模式。

我在我的 MVC 应用程序中的一个或另一个阶段都需要它们,我正在尝试创建一个匿名方法,该方法将采用实体类的类型并返回该项目数据的列表。我希望能够将此方法用于我的数据库中的任意数量的表,而不必过多地扩展我正在编写的方法。

示例数据:

  • 编号:1,描述:红色
  • 编号:2,描述:蓝色
  • 编号:3,描述:绿色

ISet 实现:

public interface ISet
{
    int Id { get; set; }
    string Description { get; set; }
}

可能的方法实现

public static IList<T> BuildSet<T>()
{
    using (var db = new somethingEntities())
        return db.Set(typeof(T)).Cast<ISet>().Select(c => new { c.Id, c.Description }).ToList();
}

用法

var data = BuildSet<YourType>();

运行时错误

Cannot create a DbSet<ISet> from a non-generic DbSet for objects of type 'YourType'.

有谁知道如何做到这一点?

谢谢。

4

2 回答 2

0

问题解决了。

方法声明

public static List<ISet> BuildSet<T>() where T : class
{
    using (var db = new somethingEntities())
        return db.Set<T>().ToList().Cast<ISet>().ToList();
}

用法

var data = ...BuildSet<YourType>();
于 2013-03-21T23:47:56.877 回答
0

我假设DbSet's 很小,因为ToList()会一次性获取所有结果?

但是,这是您的代码的更简单版本(您ISet在泛型类型约束中指定接口):

public static IList<ISet> BuildSet<T>() 
    where T : class, ISet
{
    using (var db = new somethingEntities())
        return db.Set<T>().ToList();
}

您的 DbContext 还可以选择扩展方法:

public IEnumerable<ISet> BuildSet<T>(this DbContext context)
    where T : class, ISet
{
    return context.Set<T>().AsEnumerable();
}

然后您可以在上下文的生命周期内使用它,以实现更有效的操作。(我知道我假设太多,但无论如何我觉得这是有用的信息。)

public void SomeOperation()
{
    using (var db = new somethingEntities())
    {
        foreach (var item in db.BuildSet<SimpleSet>())
        {
            //do something with item
            //SaveChanges() every 100 rows or whatever
        }
    }
}
于 2013-03-22T14:47:24.810 回答