2017-05-24 6 views
0

実行時に型をIQueryableに渡して実現することは可能ですか?実行時に型をIQueryableに渡す

と同様に、以下のように

//Get type at runtime 
Type type = Type.GetType("fully qualified class name"); 


IQueryable<type> test = // <-returned object of this type 

実際の問題:私は、特定のタイプの右側のオブジェクトを取得することができていますが、それはクエリ変数の型にキャストされていない 下。また、私はクエリの型を知っているだろう。

Dictionary<string, Type> myDictionary = new Dictionary<string, Type>() 
       { 
        { "tableName", typeof(tableName) } 
       }; 

//Below I am able to get right side object with specific type, but that is not casting to type of query variable. Also I will have known type for query. 
IQueryable<Type> query= EFContext.Set(myDictionary[tableName]).AsQueryable(); 

このクエリオブジェクトを使用して、select/where条件を動的に渡してデータを選択します。

var data = query.Select(x=> new 
       { 
        id= x.id, 
        name= x.name .. etc 
       }).ToList(); 

後で、このテスト変数を使用してデータを動的にクエリする必要があります。

また、このシナリオを解決するための代替方法をご提案ください。

+0

このようにするといいえ、いいえ。ジェネリックメソッドを作ることはできますが、コンテキストなしでは伝えることはできません。 –

+1

これを行うことは、プログラム構造に大きな問題があることを示しています。あなたの究極の目標は何ですか? – MrZander

+0

私は可能だと思いますが、その場でリポジトリ(テーブル)とタイプをマッピングする必要があるため、サービスレイヤは非常に複雑になります。また、ナビゲーションプロパティの処理は非常に複雑になります。 – Sparrow

答えて

0

あなたの意見を反映させる方法はありますが、保守性には限界があります。

interface IMyInterface 
{ 
    string SomeProperty {get;set;} 
} 

class MyClass : IMyInterface 
{ 
    public string SomeProperty {get;set;} 
} 

IQueryable<T> SomeMethod<T>() where T : IMyInterface, new() 
{ 
    var result = new List<T>() { 
     new T() { SomeProperty = "a"}, 
     new T() { SomeProperty = "b"} 
    }; 
    return result.AsQueryable(); 
} 

だから、ジェネリックメソッドの呼び出しがあるかもしれない:あなたはおそらく、あなたのタイプに共有インターフェイスを作成し、一般的な方法、このような何かを書く方がいいでしょう

var temp = SomeMethod<MyClass>(); 
1

お持ちの場合あなたが必要とするIQueryableタイプの例として、次のタイプをキャプチャするために、一般的な方法を使用することができます - これは、適切な型のnullを返します:あなたが持っている場合は

public static T NullByExample<T>(this T _) where T : class => (T)null; 

public static IEnumerable<T> EmptyByExample<T>(this T _) => Enumerable.Empty<T>(); 

どちらの結果にAsQueryableを使用します:項目の例はあなたのような拡張機能を使用することができ、返さ

var test = EmptyByExample(classObject).AsQueryable(); 

またはIQueryableバリアントを作成する - 残念ながら、本当に同等IQueryableありませんEnumerable.Emptyに:

public static IQueryable<T> EmptyQueryByExample<T>(this T _) => Enumerable.Empty<T>().AsQueryable(); 

var test = EmptyQueryByExample(queryObject); 

そうでない場合は、前述したように、あなたはREFLの世界でありますあなたが何か間違っていることを示している可能性があります。問題は、testがタイプobjectであることがわかります。その場合、コンパイラは何を表すのかを知ることができないからです。typeを表します。 varは、dynamicを使いたい場合を除き、コンパイル時の略語です(どちらもしないでください)。

関連する問題