Methods 我怎样才能重构这个;近",;当方法之间只有三个字符不同时,使用查询复制代码?

Methods 我怎样才能重构这个;近",;当方法之间只有三个字符不同时,使用查询复制代码?,methods,refactoring,duplicates,Methods,Refactoring,Duplicates,我认为枚举可能是一种方法,它会根据操作(创建、删除)替换字符吗?然后我必须为“--”、“++”、“>=”和“>”hrrmm存储一个变量。任何简单的建议都会很好,我可以把它作为今后如何解决这样一个问题的参考 public void ArrangeCategoriesOrderOnCreate(类别) { var tx=_session.BeginTransaction(); var categories=\u session.QueryOver() 。其中(c=>c.Parent.Id==cate

我认为枚举可能是一种方法,它会根据操作(创建、删除)替换字符吗?然后我必须为“--”、“++”、“>=”和“>”hrrmm存储一个变量。任何简单的建议都会很好,我可以把它作为今后如何解决这样一个问题的参考

public void ArrangeCategoriesOrderOnCreate(类别)
{
var tx=_session.BeginTransaction();
var categories=\u session.QueryOver()
。其中(c=>c.Parent.Id==category.Parent.Id&&c.OrderInList>=category.OrderInList)//此处的>=category.OrderInList
.List();
foreach(类别中的var项目)
{
item.OrderInList++;//此处的+。
_会话.保存或更新(项目);
}
tx.Commit();
}
公共作废排列类别有序删除(类别)
{
var tx=_session.BeginTransaction();
var categories=\u session.QueryOver()
.Where(c=>c.Parent.Id==category.Parent.Id&&c.OrderInList>category.OrderInList)//此处的>category.OrderInList
.List();
foreach(类别中的var项目)
{
item.OrderInList-->//此处为--。
_会话.保存或更新(项目);
}
tx.Commit();
}
编辑1

无法从Invoke、Invoke(值(Cumbriad.Infrastructure.DataServices.CategoryDataServices+c_DisplayClass8)、orderComparer、c.OrderInList、值(Cumbriad.Infrastructure.DataServices.CategoryDataServices+c_DisplayClass8)、category.OrderInList、System.Linq.Expressions.InvokeExpression确定成员类型

跟踪:

[异常:无法从Invoke、Invoke(值(Cumbriad.Infrastructure.DataServices.CategoryDataServices+c_DisplayClass8)、orderComparer、c.OrderInList、值(Cumbriad.Infrastructure.DataServices.CategoryDataServices+c_DisplayClass8)、category.OrderInList)、System.Linq.Expressions.InvokeExpression确定成员类型] NHibernate.Impl.ExpressionProcessor.ProcessBooleanExpression(表达式表达式)+1113 NHibernate.Impl.ExpressionProcessor.ProcessExpression(表达式表达式)+114 NHibernate.Impl.ExpressionProcessor.ProcessAndExpression(二进制表达式)+85 NHibernate.Impl.ExpressionProcessor.ProcessBinaryExpression(二进制表达式)+124 NHibernate.Impl.ExpressionProcessor.ProcessExpression(表达式表达式)+95 NHibernate.Impl.ExpressionProcessor.ProcessLambdaExpression(LambdaExpression表达式)+52 NHibernate.Impl.ExpressionProcessor.ProcessExpression(表达式
1表达式)+39
NHibernate.criteria.QueryOver
2.Add(表达式
1表达式)+107
NHibernate.criteria.QueryOver
2.其中(表达式
1表达式)+42
NHibernate.criteria.QueryOver
2.NHibernate.IQueryOver.Where(表达式'1表达式)+42


一个简单的开始方法是使用
Func
来区分常见功能,并消除大部分重复

public void ArrangeCategoriesOrderOnCreate(类别)
{
排列类别有序动作(类别,(a,b)=>a>=b,x=>x+1);
}
公共作废排列类别有序删除(类别)
{
安排分类顺序(分类,(a,b)=>a>b,x=>x-1);
}
公共无效安排类别有序行动(类别,
表达式排序比较器,
Func orderUpdateCalculator)
{
var tx=_session.BeginTransaction();
var categories=\u session.QueryOver()
.其中(c=>c.Parent.Id==category.Parent.Id
&&orderComparer(c.OrderInList,category.OrderInList))
.List();
foreach(类别中的var项目)
{
item.OrderInList=orderUpdateCalculator(item.OrderInList);
_会话.保存或更新(项目);
}
tx.Commit();
}

Hmmm由于某些原因,它不是语法突出显示?添加了语法突出显示,供将来参考,您可以告诉它使用什么语言。
。谢谢:)将记住这一点。谢谢,尝试了解一下发生了什么。不过我注意到的一点是,ArrangeCategoriesNaction无法根据是创建(大于或等于)还是删除(大于)来交换查询中的大于符号,但您可能没有看到,因为它没有突出显示语法!“不过看起来干净多了。”克雷格维特利说,“啊,不,没有看到区别。您可以使用另一个
Func
来解决这个问题,它接受两个整数,以您想要的方式比较它们,并返回一个布尔值,然后将一个“compareFunc”和一个“actionFunc”传递给该方法。是的,谢谢,这非常有用。还是很新的,我从来没有注意到自己故意使用Func,所以我会好好读一读它-看起来非常有用。啊,太棒了,再次干杯。不管怎么说,这是编译,这是有点难理解的一开始-但我有可靠的铅笔和纸出来,试图找出它!TIL:)我编辑了我的原始帖子,在我尝试运行您的编辑hrrrm时抛出了一个错误。还在搞清楚到底发生了什么,但是是的!