1

SQL DBには、基本的なKVPデータを格納するテーブルがいくつかあります。それらはすべてId(int)、Description(varchar(..))のパターンを持っています。

私はMVCアプリケーションのいずれかの段階でそれらすべてを必要とし、エンティティクラスのタイプを取得してそのアイテムデータのリストを返す匿名メソッドを作成しようとしています。私が書いているメソッドをあまり拡張することなく、データベース内の任意の数のテーブルにこのメソッドを使用できるようにしたいと思います。

データ例:

  • ID:1、説明:赤
  • ID:2、説明:青
  • ID: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'は小さいと思いますか?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 に答える