C# 具有插件参数的LINQ扩展方法

C# 具有插件参数的LINQ扩展方法,c#,linq,C#,Linq,我想创建一个LINQ条件字符串,然后将其插入到LINQ扩展方法中,如下所示。可能吗 string x = "a.MemberName != null && a.MemberName.Contains(RadGrid1.MasterTableView.GetColumn(\"MemberName"\).CurrentFilterValue)"; var filtered1 = listFromCache.Where(a =>

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

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

如果您打算构建一个动态Linq查询,那么我建议您使用表达式树。您可以创建一个描述逻辑的表达式树,然后只需调用Expression.Lambda即可将该树编译为委托

以下是参考文件:

编辑:

下面是一些示例代码。我不知道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));
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Linq.Expressions;
命名空间控制台应用程序1
{
公共密封类文件
{
公共字符串MemberName{get;set;}
}
公共静态类程序
{
公共静态void Main(字符串[]args)
{
//设置。。。
var documents=新列表();
添加(新文档{MemberName=“Test 1+CurrentFilterValue”});
添加(新文档{MemberName=“Test 2+CurrentFilterValue”});
添加(新文档{MemberName=“Test 3”});
//创建表达式树。。。
var参数=表达式参数(类型(文档),“文档”);
var isNotNull=Expression.NotEqual(参数,Expression.Constant(null));
var containsIsTrue=
表情(
Expression.Call(Expression.Property(参数,“MemberName”),
typeof(string).GetMethod(“包含”),
常量(“CurrentFilterValue”);
var bothAreTrue=Expression.And(isNotNull,containsIsTrue);
var lambda=Expression.lambda(bothAreTrue,parameter.Compile();
//测试。。。
var结果=文件,其中(d=>lambda(d));
}
}
}

或者您可以将其编写为易于理解的代码!你能举个例子吗?listFromCache变量的类型是什么?没有此信息无法回答。它的类型是List,MemberName是文档对象的属性。什么是文档?这是来自第三方库吗?不,这只是一个具有一些get/set属性的类。因此,您有一个类似listFromCache[0]的属性。MemberName您也可以使用反射发射,但这更复杂。