none
自定义IQueryable.OrderBy的问题 RRS feed

  • 问题

  • 由于想实现动态排序的功能,所以使用了如下代码

    var p1 = Expression.Parameter(typeof(s_Member), "s");

     var p2 = Expression.MakeMemberAccess(p1, typeof(s_Member).GetProperty("m_Code"));

     var lambda = Expression.Lambda<Func<s_Member, string>>(p2, p1);

    var result = db.s_Member.OrderByDescending(lambda);

    使用sqlserver Profiler跟踪生成的sql语句,发现并没有出现order语句,但是出来的结果却是已经排过序的。是不是如果这样写法是读出所有数据后再客户端进行排序?

    如果是var result = db.s_Member.OrderByDescending(o>o.m_Code),则是生成order语句,第一种方式如何做到也生成order语句?

    2011年9月30日 16:17

答案

全部回复

  • 写了一个传递字符串就能查询的扩展,但是报“类型“System.Linq.Queryable”上没有与提供的类型参数和参数兼容的泛型方法“Where”。如果方法是非泛型的,则不应提供类型参数。"的错误,真是没辙了。我不是已经实现了Expression<Func<TSource, bool>>。

    public static IQueryable<TEntity> Where<TEntity>(this IQueryable<TEntity> source, string key) where TEntity : class
            {
                var p1 = Expression.Parameter(typeof(TEntity), "C");
                var p2 = Expression.MakeMemberAccess(p1, typeof(TEntity).GetProperty("m_Code"));
                var p3 = Expression.Constant(key);
                var p4 = Expression.Equal(p2, p3);
                var lambda = Expression.Lambda<Func<TEntity,bool>>(p4, p1);
                           
     
                var p5 = Expression.Call(typeof(Queryable), "Where", new Type[] { typeof(TEntity), typeof(string) }, source.Expression, Expression.Quote(lambda));
                return source.Provider.CreateQuery<TEntity>(p5) as IQueryable<TEntity>;
            }
    2011年10月1日 14:26
  • Hi dna_xp,

    你可以看看这个link: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

    这里面有你想要的东西


    Alan Chen[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年10月5日 7:16
    版主