【发布时间】:2018-08-27 03:00:01
【问题描述】:
这是我要转换成 lambda 表达式的字符串
"o => new { Division = o.Division, Department = o.Department }"
其实我想创建一个匿名类型的select lambda表达式。
我可以得到这个表达式:
o => new SystemViewModel { Division = o.Division, Department = o.Department }
但我想要这个表达方式
o => new { Division = o.Division, Department = o.Department}
这是代码
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();
}
这会返回SystemViewModel 的列表,但我想要一个匿名类型的列表,只有两个动态字段 Division 和 Department(SystemViewModel 包含许多其他字段)。
【问题讨论】:
-
您能解释一下您要解决的问题吗?您在此处描述的是您针对您的问题提出的解决方案。
-
请添加您用于创建第一个表达式的代码。
-
stackoverflow.com/questions/3740532/… 可能有助于解决您的问题。
-
我想获得动态选择表达式,但匿名类型如动态
标签: c# linq-expressions