首页 新闻 赞助 找找看

Lambda 动态Select

0
悬赏园豆:80 [已解决问题] 解决于 2020-04-01 15:17

我现在要实现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时可以动态,那要多个同时包含,怎么改进这段代码呢?

忧虑的心的主页 忧虑的心 | 初学一级 | 园豆:73
提问于:2020-03-19 10:59

其实我需要一个 Expression<Func<T_Report_Year, object>> ,且这个表达式能够像Where表达式那样拼接

忧虑的心 4年前

主要借鉴这个解决https://www.cnblogs.com/jmoney/p/5689168.html

忧虑的心 4年前
< >
分享
最佳答案
0

代码生成 Expression 。

收获园豆:80
czd890 | 专家六级 |园豆:14292 | 2020-03-19 13:27

大佬,能否再明确或demo一下呢?

忧虑的心 | 园豆:73 (初学一级) | 2020-03-19 13:32

@忧虑的心:
https://blog.csdn.net/swarb/article/details/79526356

czd890 | 园豆:14292 (专家六级) | 2020-03-19 14:15

@czd890: 他这个返回的是TResult,我想实现的是object

忧虑的心 | 园豆:73 (初学一级) | 2020-03-19 19:00

@忧虑的心:

兄弟,思路就是使用动态的expression来做这个事情,
是你提出的这类问题的一个解决办法,具体要实现成什么样子,还是要根据你的业务来嘛.

锤子给你了,至于你敲个啥出来,那都是阔以的.

czd890 | 园豆:14292 (专家六级) | 2020-03-19 19:26

@czd890: 话是这样说没错,但这个业务他就要实现根据参数返回不同的字段,我真是头大,看了一下午Expression,也没找到能动态生成匿名对象的方法,所以才为难呢

忧虑的心 | 园豆:73 (初学一级) | 2020-03-19 19:33

@忧虑的心: 匿名对象其实有类型的,叫ExpandoObject

凹出来 | 园豆:33 (初学一级) | 2020-03-19 21:10

@凹出来:

动态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

czd890 | 园豆:14292 (专家六级) | 2020-03-20 10:57

@凹出来: 赞,我目前是根据ExpandoObject来解决的

忧虑的心 | 园豆:73 (初学一级) | 2020-03-20 11:59

@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
}

忧虑的心 | 园豆:73 (初学一级) | 2020-03-20 12:01

@忧虑的心:

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})
czd890 | 园豆:14292 (专家六级) | 2020-03-20 15:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册