请高手帮忙解决一个小问题,谢谢!

yanzhiyong 2010-10-21 11:56:43


//根据条件分页显示返回泛型集合
public List<Entity.Income> GetList(int startIndex, int pageSize, Expression<Func<Entity.Income, bool>> predicate,string sort,string sortDirection)
{
try
{

if (predicate == null)
{


return dct.Income.OrderByDescending(b => b.Id).Skip(startIndex - 1).Take(pageSize).ToList();
}
else
{
return dct.Income.Where(predicate)
.OrderByDescending(b=>b.id).Skip(startIndex - 1).Take(pageSize).ToList();
}
}
catch (Exception e)
{
throw e;
}





.OrderByDescending(b => b.Id) 要变成动态排序怎么整?
string sort,string sortDirection 怎么传进来。方向我知道,这个可以判断然后用Orderby 的默认。

排序字段怎么传入? 传 b=>b.id 这个表达式。或者直接传个字符串进去。。



public static class OrderExpress
{
public static Func<T, Tkey> DynamicLambda<T, Tkey>(string propertyName)
{
ParameterExpression p = Expression.Parameter(typeof(T), propertyName);

Expression body = Expression.Property(p, typeof(T).GetProperty(propertyName));

var lambda = Expression.Lambda<Func<T,Tkey>>(body, p);

return lambda.Compile();
}

用上面的方法可以传入,

dct.Income.Where(predicate).OrderByDescending(OrderExpress.DynamicLambda<Entity.Income,string>(sort)).Skip(startIndex - 1).Take(pageSize).ToList();


问题是这个要传入一个类型的参数,怎么通过反射直接取得类型的实参。。


怎么样做我只要传入排序的字符就行了,不需要传入类型。。

dct.Income.Where(predicate).OrderByDescending(OrderExpress.DynamicLambda<Entity.Income>(sort)).Skip(startIndex - 1).Take(pageSize).ToList();

...全文
155 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Glex 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yanzhiyong 的回复:]
谢谢楼上的兄弟。呵呵呵呵。

我已经解决了。。用到了微软的using System.Linq.Dynamic;
用来解决动态查询的问题的。。。呵呵呵呵。

C# code
public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params……
[/Quote]

我也在用这个类,但是在"public static IQueryable OrderBy(this IQueryable source, string ordering, params object[] values)" 这个方法中,它的第三个参数values, 我试了很久都不能正确地用到它!!!
yanzhiyong兄弟,你知道怎么使用到values这个参数吗???


jiudiwai 2010-10-23
  • 打赏
  • 举报
回复
高手啊 值得学习!
angelli09 2010-10-23
  • 打赏
  • 举报
回复
受教了~谢谢你的分享!
huminghua 2010-10-22
  • 打赏
  • 举报
回复
厉害!学习!
jshi123 2010-10-21
  • 打赏
  • 举报
回复
GetList方法增加一个参数: Func<Entity.Income, TOrder> orderby
GetList改成泛型方法:GetList<TOrder>
方法中的 .OrderByDescending(b => b.Id) 改成:.OrderByDescending(orderby)
调用是传进一个排序方法表达式:
GetList(..., income => income.Id); // 按id排序
int64 2010-10-21
  • 打赏
  • 举报
回复
yanzhiyong 2010-10-21
  • 打赏
  • 举报
回复
..............
yanzhiyong 2010-10-21
  • 打赏
  • 举报
回复
谢谢楼上的兄弟。呵呵呵呵。

我已经解决了。。用到了微软的using System.Linq.Dynamic;


用来解决动态查询的问题的。。。呵呵呵呵。



  public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values)
{
return (IQueryable<T>)OrderBy((IQueryable)source, ordering, values);
}

public static IQueryable OrderBy(this IQueryable source, string ordering, params object[] values)
{
if (source == null) throw new ArgumentNullException("source");
if (ordering == null) throw new ArgumentNullException("ordering");
ParameterExpression[] parameters = new ParameterExpression[] {
Expression.Parameter(source.ElementType, "") };
ExpressionParser parser = new ExpressionParser(parameters, ordering, values);
IEnumerable<DynamicOrdering> orderings = parser.ParseOrdering();
Expression queryExpr = source.Expression;
string methodAsc = "OrderBy";
string methodDesc = "OrderByDescending";
foreach (DynamicOrdering o in orderings)
{
queryExpr = Expression.Call(
typeof(Queryable), o.Ascending ? methodAsc : methodDesc,
new Type[] { source.ElementType, o.Selector.Type },
queryExpr, Expression.Quote(Expression.Lambda(o.Selector, parameters)));
methodAsc = "ThenBy";
methodDesc = "ThenByDescending";
}
return source.Provider.CreateQuery(queryExpr);
}








用这个的话可以直接传入字符串。。

NorthwindDataContext northwind = new NorthwindDataContext();

var query = from p in northwind.Products
where p.CategoryID == 3 && p.UnitPrice > 3
orderby p.SupplierID
select p;



 NorthwindDataContext northwind = new NorthwindDataContext();

var query = northwind.Products
.Where("CategoryID = 3 AND UnitPrice > 3")
.OrderBy("SupplierID Asc");



就可以用下面这种方法了。呵呵。。。





angelli09 2010-10-21
  • 打赏
  • 举报
回复
补充一点:

interface IComparer<T> {
// Tx < Ty 返回一个负数; Tx == Ty 返回零; Tx > Ty 返回一个大于零的整数
int Compare(T x, T y);
}
angelli09 2010-10-21
  • 打赏
  • 举报
回复
写一个类实现IComparer这个接口:
interface IComparer<T> {
int Compare(T x, T y);
}

如:

// 可以是任何类型
public class MyComparer : IComparer<string>
{
public int Compare(string s1,
string s2)
{

}

// 调用:
MyComparer myComparer = new MyComparer();
IEnumerable<String> items = objects.OrderByDescending((s => s), myComparer);

不知道这个能不能帮助你动态排序(可以按一个对象的所有指定属性进行排序)?
yanzhiyong 2010-10-21
  • 打赏
  • 举报
回复
楼上的大哥。告诉我怎么调用你这个方法。。
angelli09 2010-10-21
  • 打赏
  • 举报
回复
public static IOrderedEnumerable<T> OrderBy<T, K>(
this IEnumerable<T> source,
Func<T, K> keySelector,
IComparer<K> comparer);
public static IOrderedEnumerable<T> OrderByDescending<T, K>(
this IEnumerable<T> source,
Func<T, K> keySelector,
IComparer<K> comparer);

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧