5

私はEntity Frameworkでマッピングされたデータベースを持っています.

渡すパラメータに基づいてアイテムのリストを取得するための汎用メソッドを実装する必要があります。

getGenericList("product"); // returns the list of products
getGenericList("customer"); // returns the list of customers

を動的に取得する必要がありますdbSet。私の方法は次のように実装されています:

public static List<object> getGenericList(string entityType)
    {
        List<object> myDynamicList = new List<object>();
        using (cduContext db = new cduContext())
        {
            DbSet dbSet = db.getDBSet(entityType);
            var myDynamicList = dbSet.Select(p => p).ToList();
        }
        return new List<object>();
    }

mydbSetsは、最初に EF コードによって自動生成されます。

public DbSet<Product> Products { get; set; }
public DbSet<Custommer> Custommers { get; set; }

私のgetDBSet(entityType)メソッドは、次のようにコンテキストで実装されています。

public DbSet<T> getDBSet<T>(string entityName) where T : class
    {
        switch (entityName)
        {

            case "product":
                return Products;

            case "custommer":
                return Custommers;

次に、このエラーが発生しました:

タイプ 'System.Data.Entity.DbSet' を 'System.Data.Entity.DbSet' に暗黙的に変換することはできません

何かアイデアをください!?

注意: の方法は OK ではありませんSet()dbContextタイプは明示的に指定する必要があります...

4

2 に答える 2

4

文字列を型として扱い、実際の型にマッピングすることは避けたほうがよいでしょう。それはコードの匂いです。代わりに、型自体を使用してください。getGenericList()どちらにしても、ジェネリックを使用するメソッドを使用するコードをリファクタリングしましょう。文字列から離れられない場合は、getGenericList()メソッド内でマッピングするのではなく、呼び出すコードでマッピングを行います。これは、指定したパターンに従っているためです。

getGenericList()また、元のリストでは、EF を介して取得したリストとは対照的に、常に空のリストを返すことに注意してください。また、2 つの異なるmyDynamicList変数を使用しています。外側のものは、ステートメントのスコープ内のものによってマスクされているusingため、コンパイラ エラーは発生しません。がusing範囲外になると、インナーmyDynamicListも範囲外になります。ここで取り上げました。

public static List<T> getGenericList<T>()
{
    List<T> myDynamicList;

    using (cduContext db = new cduContext())
    {
        // consider using exception handling here as GetDbSet might get an invalid type
        DbSet dbSet = db.GetDbSet<T>();
        myDynamicList = dbSet.Select(p => p).ToList();
    }

    if (myDynamicList != null && myDynamicList.Count() > 0)
    {
        return myDynamicList;
    }
    return new List<T>();
}

// in your context class
public DbSet<T> GetDbSet<T>() where T : class
{
    return this.Set<T>();
}

// this is the code that calls getGenericList(); put this inside a function somewhere. 
// entityName holds a string value, set previously
switch(entityName.ToLower()) // making entityName case insensitive
{
    case "product":
        return getGenericList<Product>();

    case "customer":
        return getGenericList<Customer>();
}

うまくいけば、マップしたいエンティティーの種類が多すぎないことを願っていますswitch。繰り返しになりますが、switchステートメントを使用している場合、一般的には、アプローチを再考する必要があることを示している可能性があります。

于 2013-06-04T03:05:42.553 に答える