c# – IQueryable扩展方法,用于生成SelectListItem列表
发布时间:2020-12-15 22:11:53 所属栏目:百科 来源:网络整理
导读:我正在使用存储库返回IQueryable对象. 所以,我创建了一个扩展方法来返回一个SelectListItem List以用于我的视图: public static ListSelectListItem ToSelectListT(this IQueryableT query,FuncT,string value,string text){ return query.Select(x = new S
我正在使用存储库返回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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |