我现在要实现Lambda动态添加Select字段,我贴出部分代码
if (Field.ToLower().Contains("cod"))
{
ret.Data = new
{
Total = Total,
Data = GetSelector(data, s => new { s.Id, s.N_StationId, s.N_JckId, s.ReportTime, s.COD_Avg, s.COD_Max, s.COD_Min }).ToList().Select((s, i) => new
{
Num = (Page - 1) * PageSize + 1 + i++,
s.Id,
s.N_StationId,
s.N_JckId,
s.ReportTime,
s.COD_Avg,
s.COD_Max,
s.COD_Min
})
};
}
if (Field.ToLower().Contains("ph"))
{
ret.Data = new
{
Total = Total,
Data = GetSelector(data, s => new { s.Id, s.N_StationId, s.N_JckId, s.ReportTime, s.PH_Avg, s.PH_Max, s.PH_Min }).ToList().Select((s, i) => new
{
Num = (Page - 1) * PageSize + 1 + i++,
s.Id,
s.N_StationId,
s.N_JckId,
s.ReportTime,
s.PH_Avg,
s.PH_Max,
s.PH_Min
})
};
}
private IQueryable<T> GetSelector<T>(IQueryable<T_Report_Year> db, Expression<Func<T_Report_Year, T>> selector)
{
return db.Select(selector);
}
这个代码实现的是只包含其中一个cod或ph时可以动态,那要多个同时包含,怎么改进这段代码呢?
代码生成 Expression 。
大佬,能否再明确或demo一下呢?
@忧虑的心:
https://blog.csdn.net/swarb/article/details/79526356
@czd890: 他这个返回的是TResult,我想实现的是object
@忧虑的心:
兄弟,思路就是使用动态的expression来做这个事情,
是你提出的这类问题的一个解决办法,具体要实现成什么样子,还是要根据你的业务来嘛.
锤子给你了,至于你敲个啥出来,那都是阔以的.
@czd890: 话是这样说没错,但这个业务他就要实现根据参数返回不同的字段,我真是头大,看了一下午Expression,也没找到能动态生成匿名对象的方法,所以才为难呢
@忧虑的心: 匿名对象其实有类型的,叫ExpandoObject
@凹出来:
动态select 例子:
https://stackoverflow.com/questions/42559581/dynamic-lambda-using-an-expression-builder-for-select
https://stackoverflow.com/questions/606104/how-to-create-linq-expression-tree-to-select-an-anonymous-type
@凹出来: 赞,我目前是根据ExpandoObject来解决的
@czd890: stackoverflow上面的方法我也看了,比如这个方法
public static Func<MainList, T> CreateSelect<T>(string fields)
{
var parameter = Expression.Parameter(typeof(MainList), "n");
var bindings = fields.Split(',')
.Select(name => name.Trim())
.Select(name => Expression.Bind(
typeof(T).GetProperty(name),
Expression.Property(parameter, name)
));
var newT = Expression.MemberInit(Expression.New(typeof(T)), bindings);
var lambda = Expression.Lambda<Func<MainList, T>>(newT, parameter);
return lambda.Compile();
}
他返回的是这种的
s=>new {
a=s.a,
b=s.b
}
而我需要的是这种的
s=>new {
a,
b
}
@忧虑的心:
PH_Avg,PH_Max,PH_Min,COD_Avg,COD_Max,COD_Min 不就是这里面的a,b字段么,
.select(s=>new {s.a,s.b})
//==>他们是等价的
.select(s=>new {a=s.a, b=s.b})
其实我需要一个 Expression<Func<T_Report_Year, object>> ,且这个表达式能够像Where表达式那样拼接
– 忧虑的心 4年前主要借鉴这个解决https://www.cnblogs.com/jmoney/p/5689168.html
– 忧虑的心 4年前