当方法之间只有三个字符不同时,我怎么能用查询重构这个“几乎”重复的代码?

时间:2012-08-11 06:05:28

标签: methods refactoring duplicates

我认为枚举可能是要走的路,取决于动作(创建,删除)它取代了角色?然后我必须存储变量“ - ”,“++”,“> =”和“>” hrrmm。任何简单的建议都会很棒,我可以将它作为未来参考,以便我如何处理这样的问题!

public void ArrangeCategoriesOrderOnCreate(Category category)
{
    var tx = _session.BeginTransaction();
    var categories = _session.QueryOver<Category>()
        .Where(c => c.Parent.Id == category.Parent.Id && c.OrderInList >= category.OrderInList) // the >= category.OrderInList here
        .List<Category>();

    foreach(var item in categories)
    {
        item.OrderInList++; // The ++ here.
        _session.SaveOrUpdate(item);
    }
    tx.Commit();
}

public void ArrangeCategoriesOrderOnDelete(Category category)
{
    var tx = _session.BeginTransaction();
    var categories = _session.QueryOver<Category>()
        .Where(c => c.Parent.Id == category.Parent.Id && c.OrderInList > category.OrderInList) // the > category.OrderInList here
        .List<Category>();

    foreach(var item in categories)
    {
        item.OrderInList--; // the -- here.
        _session.SaveOrUpdate(item);
    }
    tx.Commit();
}

修改1

  

无法从Invoke,Invoke(值(CumbriaMD.Infrastructure.DataServices.CategoryDataServices +&lt;&gt; c_ DisplayClass8).orderComparer,c.OrderInList,value(CumbriaMD.Infrastructure.DataServices.CategoryDataServices +)中确定成员类型&lt;&gt; c _DisplayClass8).category.OrderInList),System.Linq.Expressions.InvocationExpression

跟踪:

  

[例外:无法从Invoke,Invoke(值(CumbriaMD.Infrastructure.DataServices.CategoryDataServices +&lt;&gt; c_ DisplayClass8)确定成员类型.orderComparer,c.OrderInList,value(CumbriaMD.Infrastructure.DataServices) .CategoryDataServices +&lt;&gt; c _DisplayClass8).category.OrderInList),System.Linq.Expressions.InvocationExpression]      NHibernate.Impl.ExpressionProcessor.ProcessBooleanExpression(表达式表达式)+1113      NHibernate.Impl.ExpressionProcessor.ProcessExpression(表达式表达式)+114      NHibernate.Impl.ExpressionProcessor.ProcessAndExpression(BinaryExpression表达式)+85      NHibernate.Impl.ExpressionProcessor.ProcessBinaryExpression(BinaryExpression表达式)+124      NHibernate.Impl.ExpressionProcessor.ProcessExpression(表达式表达式)+95      NHibernate.Impl.ExpressionProcessor.ProcessLambdaExpression(LambdaExpression表达式)+52      NHibernate.Impl.ExpressionProcessor.ProcessExpression(Expression 1 expression) +39 NHibernate.Criterion.QueryOver 2.Add(Expression 1 expression) +107 NHibernate.Criterion.QueryOver 2.Where(Expression 1 expression) +42 NHibernate.Criterion.QueryOver 2.NHibernate.IQueryOver.Where(Expression`1 expression)+42 < / p>

1 个答案:

答案 0 :(得分:2)

一种简单的启动方式是使用Func来区分常见功能,并消除大部分重复。

public void ArrangeCategoriesOrderOnCreate(Category category)
{
    ArrangeCategoriesOrderOnAction(category, (a,b) => a>=b, x => x + 1);
}

public void ArrangeCategoriesOrderOnDelete(Category category)
{
    ArrangeCategoriesOrderOnAction(category, (a,b) => a>b, x => x - 1);
}

public void ArrangeCategoriesOrderOnAction(Category category, 
                               Expression<Func<int, int, bool>> orderComparer,
                               Func<int, int> orderUpdateCalculator)
{
    var tx = _session.BeginTransaction();
    var categories = _session.QueryOver<Category>()
        .Where(c => c.Parent.Id == category.Parent.Id 
               && orderComparer(c.OrderInList, category.OrderInList))
        .List<Category>();

    foreach (var item in categories)
    {
        item.OrderInList = orderUpdateCalculator(item.OrderInList);
        _session.SaveOrUpdate(item);
    }
    tx.Commit();
}