[英]How to avoid duplication with 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>();
}
當您在QueryOver中使用類似的條件 (在Where子句中)和最后的類似選項時,避免重復的最佳方法是什么?
如果您使用的是Linq To Objects,則可以重構代理:
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<>
,但我沒有太多經驗。
除了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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.