从字符串生成 lambda 表达式

本文关键字:lambda 表达式 字符串 | 更新日期: 2023-09-27 18:34:11

我需要将lambda表达式存储在数据库中并动态执行它们。以下代码片段按原样运行良好,

float result = dataRowArray.AsEnumerable().Sum(r => r.Field<float>("ColumnA") * r.Field<float>("ColumnB"));

但我想将以下部分存储在字符串中...

r => r.Field<float>("ColumnA") * r.Field<float>("ColumnB")

。并动态注入,如下所示:

float result = MySession.Current.dr.AsEnumerable().Sum(storedLambdaString);

我已经做了大量的谷歌搜索,但我做得不够。有什么建议吗?

从字符串生成 lambda 表达式

我建议将查询存储在数据库中并使用LINQ执行,如下所示。

using (eEntities db = new eEntities())
{
    string query = "select name,age,salary from employees"
    var employees = db.Database.SqlQuery<Employee>(query).
}

请注意:员工是我的自定义类,其属性与查询相同。

有一个 nuget 包可以帮助你"System.Linq.Dynamic"。 此示例代码适用于...

 public class TestRow
{
    public Dictionary<string,float> Field { get; set; }
    public TestRow()
    {
        this.Field = new Dictionary<string, float>();
        this.Field.Add("ColumnA", 2);
        this.Field.Add("ColumnB", 3);
    }
}
class Program
{
    static void Main(string[] args)
    {
        var testRow = new TestRow();
        string expressionString = "r.Field['"ColumnA'"] * r.Field['"ColumnB'"]";
        var parameter = Expression.Parameter(typeof(TestRow),"r");
        var lambdaET = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { parameter }, typeof(float), expressionString);
        var result = lambdaET.Compile().DynamicInvoke(testRow);
        Console.WriteLine(result);
        Console.ReadLine();
    }
}