我想创建一个LINQ条件字符串,然后将其插入LINQ Extension方法,如下所示。这可能吗?
string x = "a.MemberName != null &&
a.MemberName.Contains(RadGrid1.MasterTableView.GetColumn(\"MemberName"\).CurrentFilterValue)";
var filtered1 = listFromCache.Where(a => x);
答案 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));
}
}
}