0

LINQ 条件の文字列を作成し、それを以下のように LINQ 拡張メソッドにプラグインしたいと考えていました。それは可能ですか?

 string x = "a.MemberName != null &&
  a.MemberName.Contains(RadGrid1.MasterTableView.GetColumn(\"MemberName"\).CurrentFilterValue)";                    
  var filtered1 =   listFromCache.Where(a => x);
4

1 に答える 1

1

動的な Linq クエリを作成することを意図している場合は、式ツリーを使用することをお勧めします。ロジックを記述した Expression Tree を作成し、Expression.Lambda を呼び出すだけで、ツリーをデリゲートにコンパイルできます。

参照ドキュメントは次のとおりです。

http://msdn.microsoft.com/en-us/library/bb397951.aspx

編集:

以下にいくつかのサンプル コードを示します。何が何なのかわからないRadGrid1.MasterTableView.GetColumn(\"MemberName"\).CurrentFilterValueので、ステートメントの評価結果のプレースホルダーとして "CurrentFilterValue" を使用しました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

namespace ConsoleApplication1
{
    public sealed class Document
    {
        public string MemberName { get; set; }
    }

    public static class Program
    {
        public static void Main(string[] args)
        {
            // Setup...
            var documents = new List<Document>();

            documents.Add(new Document { MemberName = "Test 1 + CurrentFilterValue" });
            documents.Add(new Document { MemberName = "Test 2 + CurrentFilterValue" });
            documents.Add(new Document { MemberName = "Test 3"});

            // Create the expression tree...
            var parameter = Expression.Parameter(typeof(Document), "document");

            var isNotNull = Expression.NotEqual(parameter, Expression.Constant(null));

            var containsIsTrue =
                Expression.IsTrue(
                    Expression.Call(Expression.Property(parameter, "MemberName"),
                        typeof(string).GetMethod("Contains"),
                        Expression.Constant("CurrentFilterValue")));

            var bothAreTrue = Expression.And(isNotNull, containsIsTrue);
            var lambda = Expression.Lambda<Func<Document, bool>>(bothAreTrue, parameter).Compile();

            // Test...
            var results = documents.Where(d => lambda(d));
        }
    }
}
于 2012-12-02T02:07:10.480 に答える