gpt4 book ai didi

c# - 如何对在C#中使用LINQ使用反射找到的属性进行排序?

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

我在ASP.NET MVC框架的顶部有一个用C#编写的项目。

我有一个查找工具,可以让用户查询数据并确定应对返回数据进行排序的列。换句话说,用户发出一个HTTP请求,该请求在视图模型上设置了名为SortBy的属性。 SortBystring类型,因此可以是任何东西。为了安全起见,在构建LINQ查询之前,我需要查找与名称匹配的有效列,并确保该列用Sortable属性修饰。

例如,如果视图模型上的SortBy属性设置为“名称”,则在确认“名称”是有效属性且可在实体上排序后,我需要向LINQ查询中动态添加query.OrderBy(x => x.Name)模型。

我使用reflectionPropertyDescriptor查找并验证该属性是否存在。但是,我无法使用LINQ创建OrderBy

这是创建IQueryable对象的方法

private IQueryable<Post> Find(ListPostsViewModel viewModel, int userId)
{
IQueryable<Post> query = query.Where(x => x.UserId == userId);

// ensure the property exists on the viewmodel
PropertyDescriptor viewModelProperty = TypeDescriptor.GetProperties(typeof(DisplayPostViewModel)).Find(viewModel.OrderBy, true);

if (viewModelProperty != null && viewModelProperty.Attributes.OfType<Sortable>().Any())
{
// At this point we know that the sortable column is valid and indeed is sortable by checking

// Since not all the properties in the DisplayPostViewModel match the Post model properties,
// We need to ensure we find a valid property on the Post to sort by it.
// Therefore, we find a matching property on the Post which is involved in the linq-query
PropertyDescriptor modelProperty = TypeDescriptor.GetProperties(typeof(Post)).Find(viewModelProperty.Name, true);

if (modelProperty != null )
{
// At this point we found a property on the entity-model that we can sort by
// return the query sorted by the property
return query.OrderBy(x => modelProperty.GetValue(x));
}
}

return query.OrderBy(x => x.Name);
}


但是,行 return query.OrderBy(x => modelProperty.GetValue(x));引发以下错误


  LINQ to Entities无法识别方法'System.Object
  GetValue(System.Object)'方法,并且此方法无法转换
  进入商店表达。


如何解决此问题?

最佳答案

我相信您需要创建自定义扩展方法以接受一个又名propertyName的字符串,并使用给定的字符串创建一个方法调用表达式。

将以下课程添加到您的项目中

public static class LinqExtension
{
public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string propertyName)
{
return (IQueryable<T>)OrderBy((IQueryable)source, propertyName);
}

public static IQueryable OrderBy(this IQueryable source, string propertyName)
{
var p = Expression.Parameter(source.ElementType, "p");

LambdaExpression selector = Expression.Lambda(Expression.PropertyOrField(p, propertyName), p);


var query = source.Provider.CreateQuery(

Expression.Call(typeof(Queryable),
"OrderBy",
new Type[] { source.ElementType, selector.Body.Type },
source.Expression,
selector
));

return query;
}
}


然后换行

return query.OrderBy(x => modelProperty.GetValue(x));




return query.OrderBy(modelProperty.Name);

关于c# - 如何对在C#中使用LINQ使用反射找到的属性进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51954802/

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