【半夜求救】:关于使用Dynamic的Linq 对Datable的操作求救!

时间:2021-06-03 20:55:14
午夜惊魂啊~~~~

弄这个问题弄了5、6个小时了。
我是Linq菜鸟,今天程序中要用,所以很急。

是这样的。
我目前是创建的dbml文件 然后再使用Dynamic进行操作(主要是实现一个分页功能)

代码如下:

DataClassesDataContext _context = new DataClassesDataContext();
return _context.WSB_AbroadGroupApplyMain.OrderBy(sort + " " + dir).Skip(offset).Take(page_size).ToList(); 


这个代码运行良好!

但是这个是试用的dbml文件,有很多局限性,(比如我要对几个表联合检索出的数据进行分页操作)

所以就想能不能 linq的Dynamic也能对datatable进行操作。
但是尝试了NNNN久都没搞定,无奈只有这里求救!

我的代码是这样写的:

            DataTable dt=wcbBLL.Query("SELECT * FROM WSB_AbroadGroupApplyMain").Tables[0];
            var ret = dt.AsEnumerable().OrderBy(sort + " " + dir).Skip(offset).Take(page_size).ToList();
            return ret;


但是提示orderby有错误:
错误 3 “System.Data.EnumerableRowCollection<System.Data.DataRow>”不包含“OrderBy”的定义,并且最佳扩展方法重载“System.Linq.Dynamic.DynamicQueryable.OrderBy(System.Linq.IQueryable, string, params object[])”的某些参数无效

Dynamic中orderby扩展的方法如下:


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



希望各位Linq、DoNet的达人帮忙了。 啊早上大概10点钟起了。希望看到好的解决方案。善哉善哉~

4 个解决方案

#1


不是吧,自己顶一个!!!

#2


自己再顶!!!

#3


顶顶!更健康~

#4


  DataTable dt=wcbBLL.Query("SELECT * FROM WSB_AbroadGroupApplyMain").Tables[0];
            var ret = dt.AsEnumerable().OrderBy(sort + " " + dir).Skip(offset).Take(page_size).ToList();
            return ret;

这里的orderby是按照这个表的某一列来进行排序

            var ret = dt.AsEnumerable().OrderBy(n=>n.Field<string(这里不用string也可以换成别的)>("列名")).Skip(offset).Take(page_size).ToList();

#1


不是吧,自己顶一个!!!

#2


自己再顶!!!

#3


顶顶!更健康~

#4


  DataTable dt=wcbBLL.Query("SELECT * FROM WSB_AbroadGroupApplyMain").Tables[0];
            var ret = dt.AsEnumerable().OrderBy(sort + " " + dir).Skip(offset).Take(page_size).ToList();
            return ret;

这里的orderby是按照这个表的某一列来进行排序

            var ret = dt.AsEnumerable().OrderBy(n=>n.Field<string(这里不用string也可以换成别的)>("列名")).Skip(offset).Take(page_size).ToList();