gpt4 book ai didi

c# - 生成 SelectListItem 列表的 IQueryable 扩展方法

转载 作者:行者123 更新时间:2023-11-30 12:44:20 25 4
gpt4 key购买 nike

我正在处理返回 IQueryable 对象的存储库。

因此,我创建了一个扩展方法来返回一个 SelectListItem 列表以用于我的 View :

public static List<SelectListItem> ToSelectList<T>(this IQueryable<T> query, Func<T, string> value, Func<T, 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 后,将调用传入的委托(delegate),因此这就是返回所有字段的原因。您可以改为传入表达式,然后将它们组合成一个表达式:

public static List<SelectListItem> ToSelectList<T>(this IQueryable<T> query, Expression<Func<T, object>> value, Expression<Func<T, 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# - 生成 SelectListItem 列表的 IQueryable 扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28838413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com