1

私には2つの方法があり、重複が好きではありません:

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 で使用され、最後に同様のオプションがある場合、重複を避ける最善の方法は何ですか?

4

2 に答える 2

3

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<>ませんが、私はそれについてあまり経験がありません。

于 2012-08-29T20:53:48.343 に答える
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();
}
于 2012-08-29T21:01:46.277 に答える