字符串如何转成LINQ表达式呢?麻类有经验的大牛指点一下

禁用F3 2014-10-25 10:58:44

string a="user=>u.name==txtName";
db.user.where(a);想把字符串转成到这里面来要如何写呢?
...全文
234 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Magni2012 2017-02-23
  • 打赏
  • 举报
回复
@楼主 notax的方法应该可以满足你的需求吧 -->在4.0框架上没有System.Linq.Dynamic.DynamicExpression http://dynamiclinq.codeplex.com -->PS,需要把字符串转表达式 变量g的声明改为Expression<Func<User, bool>>试下
smthgdin_020 2014-10-27
  • 打赏
  • 举报
回复
自己写一个转换器,或者上网找。 lambdaparse(string xxx)
禁用F3 2014-10-27
  • 打赏
  • 举报
回复
引用 4 楼 duanzi_peng 的回复:
好麻烦。你的a是手动拼接的,为什么要搞成字符串?在也有错误,user=>u.name==txtName 不是user=> ,是u=>。 看看下面的

Func<User, bool> filterFunc = u=>u.name==txtName;
db.user.where(filterFunc);
是的,一楼是写错了,我目的就是想把字符串改为LINQ表达式
exception92 2014-10-27
  • 打赏
  • 举报
回复
好麻烦。你的a是手动拼接的,为什么要搞成字符串?在也有错误,user=>u.name==txtName 不是user=> ,是u=>。 看看下面的

Func<User, bool> filterFunc = u=>u.name==txtName;
db.user.where(filterFunc);
禁用F3 2014-10-27
  • 打赏
  • 举报
回复
引用 2 楼 notax 的回复:

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;
        }
    }
}

在4.0框架上没有System.Linq.Dynamic.DynamicExpression PS,需要把字符串转表达式
notax 2014-10-26
  • 打赏
  • 举报
回复

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;
        }
    }
}

devmiao 2014-10-25
  • 打赏
  • 举报
回复
可以用dynamic linq这个库。 如果不涉及表达式解析,也可以构造表达式树,参考 http://bbs.csdn.net/topics/390914025

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧