2014-12-15 2 views
0

У меня есть необходимость хранить лямбда-выражения в базе данных и выполнять их динамически. Следующий фрагмент кода работает хорошо, как это,Сгенерировать лямбда-выражение из строки

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

Я сделал тонну Google, но я скоро приду. Какие-либо предложения?

+1

http://blog.codebrain.co.uk/post/2009/05/05/C-String-to-LINQ-Expression.aspx –

ответ

2

Предлагаю хранить запрос в базе данных и выполнять с помощью LINQ, как показано ниже.

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

Обращаем ваше внимание: Сотрудник здесь имеет свой собственный класс, имеющий свойства, аналогичные запрошенным.

1

Theres пакет 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(); 
    } 
} 
Смежные вопросы