这两个Where条件的区别是什么?

本文关键字:条件 区别 是什么 Where 两个 | 更新日期: 2023-09-27 18:16:39

我有一个使用NHibernate的项目。我用QueryOver写了一个查询。

var q = SessionInstance.QueryOver<Person>();
list<Person> TypeList = new list<Person>();

这两个Where条件有什么区别?

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));

这两个Where条件的区别是什么?

第二个版本更加面向对象,而第一个版本基本上是函数式编程。

在第一个版本中,您创建了一个对象,它可以为任何给定的Person对象返回true或false。在对象的创建过程中,您所告诉它的只是查找什么(例如空值)和在哪里(在本例中是在属性PersonType中)。

第二个版本实际上可能会让你认为没有对象要提到(我们在谈论c#,所以一切都是对象)。您所做的只是将函数体发送给Where方法。

在这两种情况下,Where方法将以相同的方式运行——对于每个人,将其作为参数发送给给定对象。不同之处在于对象的工作方式。而delegate/lambda将指令指针移动到方法体存储的地方(不完全是…这仍然不是汇编,而是一种汇编),OO解决方案开始检查它的内部状态,以应用一个条件(比如激活您发送给它的lambda,以便从Person提取PersonType)。然后,它询问您告诉它的问题("IsNull"),并返回答案。

这只是说同一件事的两种方式,我知道(这就是为什么你得到相同的结果),但区别在于哪里是控制和哪里是数据
OO版本将控件从数据中分离出来,并通过使用接口隐藏实现(您只需告诉它您想要什么以及在哪里找到数据,但不告诉它如何使用它来创建答案)。函数式方法要求您提供完整的实现,然后让您运行(类似于:"您处理数据、提取、控制以及您想要的任何东西……你可能会做得更好")。

希望能说清楚