0

私のプロジェクトでは、次のように2つのエンティティオブジェクト(db内の2つのテーブルに委任)があります。

  • Tbl_Person {ID、名前}
  • Tbl_Class {ID、名前、PersonID}

DALでは、これらのエンティティ用に2つのクラスを作成し、関数GetList()を記述します。

public List<Tbl_Person> GetList()
{
    using (var db = DatabaseHelper.DataContext())
    {
        try
        {
            var _t = (from info in db.**tbPerson** 
                      select info).ToList();
            return _t.ToList<**Tbl_Person**>();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

クラスMyClass:

public List<Tbl_Class> GetList()
{
    using (var db = DatabaseHelper.DataContext())
    {
        try
        {
            var _t = (from info in db.**tbClass** 
                      select info).ToList();
            return _t.ToList<**Tbl_Class**>();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

2つのクラスを使用する場合、GetList()を使用してリストオブジェクトを正しく取得できます。しかし、ここには重複した関数GetList()があるようです。私が欲しいのは、このような1つの関数GetList()だけです:

public List<T> GetList()
{
    using (var db = DatabaseHelper.DataContext())
    {
        try
        {
            var _t = (from info in db.**????????** 
                      select info).ToList();
            return _t.ToList<**T**>();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}
4

2 に答える 2

2

まず、無意味なtry/catchブロックを取り除きます。これらの各メソッドは、例外をキャッチして再スローするだけなので、必要な長さの2倍になりますが、同時に情報が失われます。(再スローする必要がある場合は、throw;代わりに使用してくださいthrow ex;。)

第二に、ここでクエリ式を使用してもまったく意味がありません。あなたはただテーブル全体に興味があります。(ちなみに、呼び出しごとにテーブル全体をフェッチしてもよろしいです?)

ToList第三に、これらが適切な強い型のデータコンテキストであると仮定すると、そもそもtype引数を指定する必要はないと思います。

したがって、2つの方法は*実際には次のように減らすことができます。

// In MyClass
public List<Tbl_Class> GetList()
{
    using (var db = DatabaseHelper.DataContext())
    {
        return db.tbClass.ToList();
    }
}

// In Person
public List<Tbl_Person> GetList()
{
    using (var db = DatabaseHelper.DataContext())
    {
        return db.tbPerson.ToList();
    }
}

これで、次を使用して冗長性を削除できますDataContext.GetTable<TEntity>

// In DatabaseHelper:
public static List<T> GetList<T>()
{
    using (var db = DataContext())
    {
        return db.GetTable<T>().ToList();
    }
}

// In MyClass
public List<Tbl_Class> GetList()
{
    return DatabaseHelper.GetList<Tbl_Class>();
}

// In Person
public List<Tbl_Person> GetList()
{
    return DatabaseHelper.GetList<Tbl_Person>();
}

個々のクラスのメソッドが必要かどうかは明確ではありません...

(これらすべてに加えて、タイプの名前を変更して、マッピングからプレフィックスを削除することを強くお勧めしますTbl_。コード、IMOではかなりひどいように見えます。)

于 2012-04-09T07:36:05.747 に答える
1

Entity FrameworkとIObjectSetを使用して、求めていることを実現できます。でも、やりたいことが賢明なことかどうかはわかりません。

public class Repository
{
    private readonly IObjectContext _context;

    public void Repository(IObjectContext context)
    {
        _context = context;
    }

    public IEnumerable<T> GetList<T>() where T : class
    {
        return _context.CreateObjectSet<T>().ToList();
    }        
}
于 2012-04-09T07:43:37.697 に答える