2012-02-23 101 views
1

我想出了一個簡單的例子,希望能夠說明我的目標。我目前有一種方法返回一種排序「排名」它並不複雜,但它不會轉換爲SQL。性能很糟糕,因爲它全部在內存中完成,我試圖提高速度。在Linq創建一個排序表達式方法

public class Something 
{ 
    DateTime Date {get; set;} 
    // ... 

    public int SortRank(Sort sort) 
    { 
    if (sort == Sort.Newest) 
    { 
     return -Date.Ticks; 
    { 
    else if (sort == sort.Oldest) 
    { 
     return Date.Ticks; 
    } 
    } 
} 

enum Sort 
{ 
    Newest, 
    Oldest 
} 

using (Context db = new Context() 
{ 
    var q = db.GetTable<Something>() 
      .OrderBy(x=> x.SortRank(Sort.Newest)); 
} 

SortRank()目前還沒有轉換爲SQL所以我想將它轉化成一個表達式,以便它可以在數據庫中進行評估。做這個的最好方式是什麼?是的,我知道我可以在匿名lambda內實現這個內聯,但我更關心如何生成一個表達式。

+0

更好的方法是讓你的'SortRank'返回'IOrderedQueryable ',並將'OrderBy'或'OrderByDescending'附加到'IQueryable '傳遞給它。 – dasblinkenlight 2012-02-23 04:25:24

+0

DateTime沒有TotalSeconds屬性。你究竟想達到什麼目的?它看起來像你試圖通過Date屬性排序;如果是這種情況,那麼只需按日期屬性排序,根據需要調用OrderBy或OrderByDescending。 – phoog 2012-02-23 07:42:23

+0

@phoog:我更新了我的問題,使用Ticks而不是TotalSeconds。 「是的,我知道我可以在匿名lambda內部實現這個內聯,但我更關心如何生成表達式。」 – Mark 2012-02-24 04:15:16

回答

1

我會建議其他人建議您創建一個IOrderedQueryable。創建一個表達式(尤其是像上面那樣的表達式)非常簡單。你可以看一下的參數排序依據獲得如何構建它的想法,它會看起來像:

Expression<Func<Something, Date>> sortExpression = t => t.Date; 

然後你可以使用它像這樣db.GetTable<Something>().OrderBy(sortExpression)。所以你可以看到你可以很容易地創建不同的排序表達式。這就是說我仍然認爲你創建一個IOrderedQueryable的東西是最乾淨的,並且會產生最好的SQL查詢。

public IOrderedQueryable<Something> SortRank(IQueryable<Something> query, Sort sort) 
{ 
    Expression<Func<Something, DateTime>> sortExpression = t => t.Date; 

    if (sort == Sort.Newest) 
    { 
     return query.OrderByDescending(sortExpression); 
    } 
    else 
    { 
     return query.OrderBy(sortExpression); 
    } 
} 

你可以在簽名甚至改變

public static IOrderedQueryable<Something> SortRank(this IQueryable<Something> query, Sort sort) 

,並把它作爲一個擴展方法。

然後,你可以這樣調用:

using (Context db = new Context() 
{ 
    var q = SortRank(db.GetTable<Something>(), Sort.Newest); 
    //Extension method version 
    var q = db.GetTable<Something>().SortRank(Sort.Newest); 
} 

另一種選擇是創建表達式樹直接翻譯你的枚舉查詢當然,這是比較複雜,我相信你可以找到一些偉大的信息在Google和SO上。