2010-06-16 50 views
2

我想創建一個頁面和排序對象的數據源,在執行之前返回所有結果,然後在過濾之前對這些結果進行排序,然後使用take和skip方法從數據庫中檢索結果的子集(保存數據庫流量)。這是基於以下文章:GridView的ObjectDataSource LINQ的分頁和使用多個表查詢排序

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

現在,我已經成功地得到這個工作,甚至創造lambda表達式以反映排序表達式從電網恢復甚至找出數據類型進行排序的日期時間和小數。

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。

對此的任何幫助將不勝感激,我明白,這是複雜的東西。

回答

1

這是一個函數式編程的東西。通過做一個分配來改變賬戶已經沒有了。新-ING了你想要的是在外形的新實例

步驟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類型的詳細信息來生成具有該形狀的select子句。

+0

非常感謝。我決定下載創建MSSQL視圖。這種方式將涉及爲網站上的每個頁面創建新的部分類。這絕對是一件需要銘記的事情。乾杯 – Bodar 2010-06-16 16:30:42