5

標準のLINQクエリがあります:

var list = from x in SomeDataContext.ViewName
           where //Rest of where clause
           select x;

実行時に変更できるように、動的LINQクエリを作成できるかどうかを知りたいですSomeDataContext.ViewName

私には約5つの異なるビューがあり、すべてwhere句を実行するために必要な基本列がありますが、他のビューごとにいくつかの異なる列名があります。

それで、必要なときに実行時に異なるコンテキストを使用できるようにクエリを構築することは可能ですか?

例:

public void SomeMethod()
{
    var listA = GetList("DataContext.ViewA");
    var listB = GetList("DataContext.ViewB");
    var listC = GetList("DataContext.ViewC");
}

public List<EntityObject> GetList(string dataContextName)
{
    return (from x in /*HERE I WANT TO USE THE dataContextName*/
           where //Rest of where clause
           select x).ToList();
}
4

2 に答える 2

6

式ツリーを使用して、動的LINQクエリを作成できます。次に例を示します:http://msdn.microsoft.com/en-us/library/bb882637.aspx

別のアプローチは、動的LINQライブラリを使用することです: http ://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

両方のアプローチをここに示します:http: //www.codeproject.com/Articles/231706/Dynamic-query-with-Linq

この例の述語ビルダーは、式ツリーアプローチを使用します。

一般に、動的LINQの実装は簡単ですが、式ツリーの方がタイプセーフです。

于 2012-12-10T08:04:38.983 に答える
3

間接参照の別のレイヤーを追加するだけです。

public void SomeMethod()
{
    var listA = GetList("DataContext.ViewA");
    var listB = GetList("DataContext.ViewB");
    var listC = GetList("DataContext.ViewC");
}

public List<EntityObject> GetList(string dataContextName)
{
    return (from x in GetSpecificSource(dataContextName)
           where //Rest of where clause
           select x).ToList();
}

public IEnumerable<MyType> GetSpecificSource(string dataContextName)
// Or: public IQueryable<MyType> GetSpecificSource(string dataContextName)
{
    // ToDo: Return the correct source depending on the name. E.g.:
    switch(dataContextName)
    {
        case "DataContext.ViewA":
            return DataContext.ViewA;
        case "DataContext.ViewB":
            return DataContext.ViewB;
        case "DataContext.ViewC":
            return DataContext.ViewC;
    }
}

リフレクションの使用方法に関する最新情報

目的の名前のフィールドから値を取得します。

var fieldName = "ViewA";
var fieldFound = type.GetField(fieldName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);

if(fieldFound != null)
{
    return fieldFound.GetValue(instance);
}

目的の名前のプロパティから値を取得します。

var propertyName = "ViewA";
var propertyFound = type.GetProperty(propertyName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);

if(propertyFound != null)
{
    return propertyFound.GetValue(instance, null);
}

目的の名前のメソッドから値を取得します。

var methodName = "ViewA";
var methodFound = type.GetMethod(methodName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);

if(methodFound != null)
   && methodFound.GetParameters().Length == 0)
{
    return methodFound.Invoke(instance, null);
}

これまでのところ、これらはいくつかの簡単な例です。リフレクションは、問題と質問の完全に新しいバッグを開きます。上記の例から始めて、それがあなたの欲求を満たしているかどうかを確認してください。それ以外の場合は、単に新しい質問で戻ってきます。;-)

于 2012-12-10T08:13:55.220 に答える