簡體   English   中英

如何避免與QueryOver重復

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM