【问题标题】:GridView ObjectDataSource LINQ Paging and Sorting using multiple table queryGridView ObjectDataSource LINQ 使用多表查询进行分页和排序
【发布时间】:2010-06-16 10:57:16
【问题描述】:

我正在尝试创建一个分页和排序对象数据源,在执行之前返回所有结果,然后在过滤之前对这些结果进行排序,然后使用 take 和 skip 方法,目的是从数据库中检索结果的子集(节省数据库流量)。这是基于以下文章:

http://www.singingeels.com/Blogs/Nullable/2008/03/26/Dynamic_LINQ_OrderBy_using_String_Names.aspx

现在我已经设法让这项工作发挥作用,甚至创建 lambda 表达式以反映从网格返回的排序表达式,甚至找出要为 DateTime 和 Decimal 排序的数据类型。

public static string GetReturnType<TInput>(string value)
        {
            var param = Expression.Parameter(typeof(TInput), "o");
            Expression a = Expression.Property(param, "DisplayPriceType");
            Expression b = Expression.Property(a, "Name"); 
            Expression converted = Expression.Convert(Expression.Property(param, value), typeof(object));
            Expression<Func<TInput, object>> mySortExpression = Expression.Lambda<Func<TInput, object>>(converted, param);
            UnaryExpression member = (UnaryExpression)mySortExpression.Body;
            return member.Operand.Type.FullName;
        }

现在我遇到的问题是许多查询返回连接表,我想对其他表中的字段进行排序。

因此,在执行查询时,您可以创建一个函数,将其他表中的属性分配给部分类中创建的属性。

public static Account InitAccount(Account account)
        {
            account.CurrencyName = account.Currency.Name;
            account.PriceTypeName = account.DisplayPriceType.Name;
            return account;
        }

所以我的问题是,有没有办法将连接表中的值分配给当前表部分类的属性?我试过用。

from a in dc.Accounts
                                 where a.CompanyID == companyID
                                 && a.Archived == null
                                 select new { 
PriceTypeName = a.DisplayPriceType.Name})

但这似乎弄乱了我的 SortExpression。

对此的任何帮助将不胜感激,我明白这是复杂的事情。

【问题讨论】:

    标签: c# linq reflection sorting lambda


    【解决方案1】:

    这是一个函数式编程的东西。通过分配更改帐户已结束。新建一个你想要的形状的新实例。

    第 1 步:声明一个具有所需结果形状的类:

    public class QueryResult
    {
      public int CompanyID {get;set;}
      public string CurrencyName {get;set;}
      public string PriceTypeName {get;set;}
    }
    

    第 2 步:在您的查询中投影到该类

    from ...
    where ...
    select new QueryResult()
    {
      CompanyID = a.CompanyID,
      CurrencyName = a.Currency.Name,
      PriceTypeName = a.PriceType.Name
    };
    

    第 3 步:盈利! (按那个顺序)

    查询生成器将使用您的 QueryResult 类型的详细信息来生成具有该形状的选择子句。

    【讨论】:

    • 非常感谢。我决定继续创建 MSSQL 视图。因为这种方式将涉及为网站上的每个页面创建新的部分类。这绝对是一件值得铭记的事情。干杯
    猜你喜欢
    • 2010-11-03
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多