2012-08-29 75 views
1

我有兩個方法,不喜歡重複重複:如何避免與QueryOver

public Order LatestOrderOver(decimal amount) 
{ 
    return session.QueryOver<Order>() 
     .Where(o => o.Amount > amount) 
     .OrderBy(sr => sr.CompleteUtcTime).Desc 
     .Take(1) 
     .SingleOrDefault<Order>(); 
} 

public Order LatestAmericanOrderOver(decimal amount) 
{ 
    return session.QueryOver<Order>() 
     .Where(o => o.Amount > amount && o.Country == "USA") 
     .OrderBy(sr => sr.CompleteUtcTime).Desc 
     .Take(1) 
     .SingleOrDefault<Order>(); 
} 

什麼是避免重複,當你有類似的標準(在WHERE子句中)使用的最佳方法在QueryOver和類似的選項結束?

+0

爲什麼不直接使用''FirstOrDefault從'NHibernate.Linq'命名空間,而不是'取(1).SingleOrDefault()'()?注意:我不是一個喜歡玩的人。 – hIpPy

+1

@hIpPy這不是Linq,而是一個QueryOver API。這些方法看起來像Linq方法。所有這些都在'IQueryOver '接口上定義,它不從'IEnumerable'或'IQueryable'繼承。 –

回答

3

如果您正在使用LINQ to對象,你可以重構出代表:

private Order LatestOrderOver(Func<Order, bool> f) { 
    return 
    session.QueryOver<Order>() 
    .Where(f) 
    .OrderBy(sr => sr.CompleteUtcTime).Desc 
    .Take(1) 
    .SingleOrDefault<Order>(); 
} 

public Order LatestOrderOver(decimal amount) { 
    return LatestOrderOver(o => o.Amount > amount); 
} 

public Order LatestAmericanOrderOver(decimal amount) { 
    return LatestOrderOver(o => o.Amount > amount && o.Country == "USA"); 
} 

否則它可能會只是改變Func<>Expression<>工作,但我沒有與太多的經驗。

+0

這是一個好主意,但我仍然在Where子句中有重複。在我的真實例子中,where子句更復雜,其中包含相似的元素和不同的元素 –

+1

@MichaelHedgpeth:你也可以拆分條件並在私有方法中擁有一個Where,並在每個方法中使用Where來調用它。 – Guffa

+0

沒意識到;謝謝! –

0

除了Guffa的建議,您如何看待擴展方法?

public static class QueryOverExtensions 
{ 
    public static Order LastOrder(this IQueryOver<Order, Order> query) 
    { 
     return query 
      .Where(o => o.Amount > amount) 
      .OrderBy(sr => sr.CompleteUtcTime).Desc 
      .Take(1) 
      .SingleOrDefault<Order>(); 
    } 

    // Other query over extension methods 
} 

然後,你可以寫你的方法爲:

public Order LatestOrderOver(decimal amount) 
{ 
    return session.QueryOver<Order>() 
     .LastOrder(); 
} 

public Order LatestAmericanOrderOver() 
{ 
    return session.QueryOver<Order>() 
     .Where(o => o.Country == "USA") 
     .LastOrder(); 
} 
+0

這是個好主意,但我仍然在Where子句中有重複。在我的真實例子中,where子句更復雜,其中包含相似的元素和不同的元素。 –

+0

現在情況如何?我已將common子句移至擴展方法。請注意,我不是100%確定這將與QueryOver一起使用。它適用於(NHibernate)Linq。你可以寫'.Where(o =>)。其中(o =>)。其中...在Linq中。 –

+0

呵呵,剛剛意識到Guffa提到了同樣的事情:) –