This is the string i want to convert into lambda expression
"o => new { Division = o.Division, Department = o.Department }"
Actually, I want to create a select lambda expression of anonymous type.
I am able to get this expression:
o => new SystemViewModel { Division = o.Division, Department = o.Department }
but I want this expression
o => new { Division = o.Division, Department = o.Department}
This is the code
var dte = ctx.Database.SqlQuery<SystemViewModel>("select distinct Division,Department from TestReportView").ToList();"
var result2 = dte.Select(CreateNewStatement(string.Join(",", "Division,Department"))).ToList();
Func<SystemViewModel, SystemViewModel> CreateNewStatement(string fields)
{
// input parameter "o"
var xParameter = Expression.Parameter(typeof(SystemViewModel), "o");
// new statement "new Data()"
var xNew = Expression.New(typeof(SystemViewModel));
// create initializers
var bindings = fields.Split(',').Select(o => o.Trim())
.Select(o => {
// property "Field1"
var mi = typeof(SystemViewModel).GetProperty(o);
// original value "o.Field1"
var xOriginal = Expression.Property(xParameter, mi);
// set value "Field1 = o.Field1"
return Expression.Bind(mi, xOriginal);
}
);
// initialization "new Data { Field1 = o.Field1, Field2 = o.Field2 }"
var xInit = Expression.MemberInit(xNew, bindings);
// expression "o => new Data { Field1 = o.Field1, Field2 = o.Field2 }"
Type anonType = new { Name = "abc", Num = 123 }.GetType();
var lambda = Expression.Lambda<Func<SystemViewModel, SystemViewModel>>(xInit, xParameter);
var e = lambda.Body.ToString();
//LambdaExpression.
// compile to Func<Data, Data>
return lambda.Compile();
}
This returns a list of SystemViewModel
but I want a list of anonymous types, with only the two dynamic field Division and Department (SystemViewModel
contains many other fields).