110,533
社区成员
发帖
与我相关
我的任务
分享
string a="user=>u.name==txtName";
db.user.where(a);想把字符串转成到这里面来要如何写呢?
Func<User, bool> filterFunc = u=>u.name==txtName;
db.user.where(filterFunc);
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
namespace StringToExpressionTreeTest
{
class Program
{
public class User
{
public string Name { get; set; }
public string Phone { get; set; }
}
static void Main(string[] args)
{
var exp = @"user => user.Name == txtName";
//var exp = @"user => user.Name != txtName"; //for testing
//var exp = @"user => user.Name.Contains(txtName)"; ////for testing
var txtName = "abc";
var users = new List<User>()
{
new User { Name = "abc", Phone = "a123"},
new User { Name = "xyz", Phone = "x123"},
};
var e = BuildExpression(exp);
Predicate<User> g = user => (bool)e.Compile().DynamicInvoke(user, txtName);
//var query = users.Where(user => g(user));
var query = users.FindAll(g);
//Expression<Func<User, string, object>> g = (obj, s) => e.Compile().DynamicInvoke(obj, s); //for db
//Func<User, string, bool> g = (obj, s) => (bool)e.Compile().DynamicInvoke(obj, s); // for objets
//var query = users.Where(user => g(user, txtName));
foreach (var each in query)
Console.WriteLine("{0} {1}", each.Name, each.Phone);
Console.ReadKey();
}
private static LambdaExpression BuildExpression(string expression)
{
var exp = expression.Split(new string[] { "=>" }, StringSplitOptions.None)[1];
var p1 = Expression.Parameter(typeof(User), "user");
var p2 = Expression.Parameter(typeof(string), "txtName");
var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(
new[] {
p1,
p2
},
null,
exp);
return e;
}
}
}