加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读