我有一个使用NHibernate的项目。我通过QueryOver编写了一个查询。
var q = SessionInstance.QueryOver<Person>();
list<Person> TypeList = new list<Person>();
这两个哪里条件有什么区别?
q = q.Where(Restrictions.Or(Restrictions.On<Person>(p => p.PersonType).IsNull, Restrictions.On<Person>(p => p.PersonType).IsIn(TypeList)));
和
q = q.Where(p => p.PersonType == null || p.PersonType.IsIn(TypeList));
答案 0 :(得分:1)
第二个版本更多OO,而第一个版本基本上是功能编程。
在第一个版本中,您创建了一个对象,该对象可以为任何给定的Person对象返回true或false。在创建对象期间,您要告诉它的是要查找的内容(例如,null值)和where(在这种情况下,在适当的PersonType中)。
第二个版本实际上可能会让你认为没有提到的对象(我们正在谈论C#,所以一切都是对象)。您所做的只是将函数体发送到Where方法。
在这两种情况下,Where方法将以相同的方式运行 - 对于每个人,将其作为参数发送给给定对象。不同之处在于对象的工作原理。委托/ lambda将指令指针移动到方法体存储的任何位置(不完全......这仍然不是汇编,但有点'),OO解决方案开始检查它的内部状态以应用条件(如激活您发送的lambda用于从Person中提取PersonType)。然后它询问你告诉它的问题(“IsNull”),并返回答案。
这只是说同一件事的两种方式,我知道(这就是为什么你得到相同的结果),但不同之处在于控件在哪里以及数据在哪里。<登记/>
OO版本将控件与数据分开,并通过使用界面隐藏实现(您只需告诉它您想要什么以及在何处查找数据,而不是如何使用它来创建答案)。
功能方法要求您提供完整的实现,并让您运行(类似于:“您处理数据,提取,控制以及您想要的任何内容......无论如何,您可能会做得更好”) 。
希望清除它