带插件参数的LINQ扩展方法

时间:2012-12-02 01:55:19

标签: c# linq

我想创建一个LINQ条件字符串,然后将其插入LINQ Extension方法,如下所示。这可能吗?

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

1 个答案:

答案 0 :(得分:1)

如果您打算构建动态Linq查询,那么我建议您使用表达式树。您可以创建一个描述逻辑的表达式树,然后您可以简单地调用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));
        }
    }
}