c# – IQueryable扩展方法,用于生成SelectListItem列表

c# – IQueryable扩展方法,用于生成SelectListItem列表,第1张

概述我正在使用存储库返回IQueryable对象. 所以,我创建了一个扩展方法来返回一个SelectListItem List以用于我的视图: public static List<SelectListItem> ToSelectList<T>(this IQueryable<T> query, Func<T, string> value, Func<T, string> text){ re 我正在使用存储库返回Iqueryable对象.

所以,我创建了一个扩展方法来返回一个SelectListItem List以用于我的视图:

public static List<SelectListItem> ToSelectList<T>(this Iqueryable<T> query,Func<T,string> value,string> text){    return query.Select(x => new SelectListItem() { Text = text(x),Value = value(x) }).ToList();}

我这样称呼:

var query = Repository<MyClass>.GetAll(); //Return MyClass Iqueryable var test = query.ToSelectList(x => x.Property1,x => x.Property2);

它运行良好(返回正确的列表),但sql生成从MyClass中选择所有属性.我想在db上只查询Property1和Property2.

我在那里错过了什么?

解决方法 从数据库中检索结果x后,将调用传入的委托,这就是返回所有字段的原因.您可以传入表达式,然后将它们组合成一个表达式:

public static List<SelectListItem> ToSelectList<T>(this Iqueryable<T> query,Expression<Func<T,object>> value,string>> text){    var valueSrc = getProperty(value);    var textSrc  = getProperty(text);        var x = Expression.Parameter(typeof(T),"x");    var type = typeof(SelectListItem);    var textProp = type.GetProperty("Text");    var valueProp = type.GetProperty("Value");    // x.valueSrc    Expression valueExpr = Expression.Property(x,valueSrc);    // (x.valueSrc).ToString()    if (valueExpr.Type == typeof(int))    {         var toStringMethod = typeof(int).getmethod("ToString",Type.EmptyTypes);         valueExpr = Expression.Call(valueExpr,toStringMethod);    }    //x => new SelectListItem { Text = x.textSrc,Value = valueExpr }    var lambda = Expression.Lambda<Func<T,SelectListItem>>(                    Expression.MemberInit(                        Expression.New(type),Expression.Bind(textProp,Expression.Property(x,textSrc)),Expression.Bind(valueProp,valueExpr)),x);    return query.Select(lambda).ToList();}static PropertyInfo getProperty(LambdaExpression exp){    var body = exp.Body;    //x => (object) x.Property    var ue = body as UnaryExpression;    if (ue != null)        body = ue.Operand;    return (PropertyInfo) ((MemberExpression) body).Member;        }
总结

以上是内存溢出为你收集整理的c# – IQueryable扩展方法,用于生成SelectListItem列表全部内容,希望文章能够帮你解决c# – IQueryable扩展方法,用于生成SelectListItem列表所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1231162.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存