
所以,我创建了一个扩展方法来返回一个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列表所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)