如果我使用类似NHibernate的ORM,为什么我需要LINQ?

时间:2012-01-13 09:49:05

标签: c# linq nhibernate orm

I was reading this SO question but still I am not clear about one specific thing.

如果我使用NHibernate,为什么我需要LINQ?

当我知道NHibernate还包括LINQ支持时,我脑海中的问题变得更加严重。

LINQ to NHibernate?

WTF!

5 个答案:

答案 0 :(得分:6)

LINQ查询语言。它允许您以不依赖于持久层的方式表达查询。

您可能会考虑LINQ 2 SQL ORM

使用LINQ命名这两者会导致像你这样的不幸混淆。

nHibernate,EF,LINQ2XML都是LINQ providers - 它们都允许您使用LINQ语法查询数据源。

答案 1 :(得分:3)

首先,单独的LINQ不是ORM。查询对象是一个DSL,无论它来自何处。

因此,您可以将LINQ与Nhibernate一起使用

我相信你误解了LINQ to SQLLINQ

答案 2 :(得分:3)

嗯,你不需要Linq,你总是可以没有它,但你可能想要它。

Linq提供了一种方法来表达对可以查询的数据集行为的操作,然后我们可以根据该数据的状态执行其他操作。它是故意编写的,以便尽可能不可知,无论数据是内存中的集合,XML,数据库等。最终它总是在某种内存对象上运行,有一些在内存和内存之间进行转换的方法。最终的来源,虽然有些绑定比其他绑定更进一步推动一些操作到另一层。例如。调用.Count()可以最终查看Count属性,旋转集合并保持计数,向数据库发送Count(*)查询或其他内容。

ORM提供了一种让内存中对象和数据库行相互反映的方法,其中一个更改反映在另一个上。

这很适合上面的“转换方式”。因此,Linq2SQL,EF和Linq2NHibernate都可以同时实现ORM角色和Linq提供者角色。

考虑到Linq可以处理集合,你必须非常反常地创建一个根本不支持Linq的ORM(你必须将你的集合设计为不实现IEnumerable<T>因此与foreach合作。更直接地支持它意味着您可以提供更好的支持。至少应该提高查询效率。例如,如果ORM为我们提供了一种方法来获取反映Users表中所有行的users对象,那么我们总能做到:

  int uID = (from u in Users where u.Username == "Alice" select u.ID).FirstOrDefault();

通过Users实施IQueryable<User>,如果没有对Linq的直接支持,那么这将成为:

SELECT * FROM Users

其次是:

while(dataReader.Read())
  yield return ConstructUser(dataReader);

其次是:

foreach(var user in Users)
  if(user.Username == "Alice")
    return user.ID;
return 0;

实际上,它只是略差一点。通过直接支持,生成的SQL查询将是:

SELECT TOP 1 id FROM Users WHERE username = 'Alice'

然后C#等同于

return dataReader.Read() ? dataReader.GetInt32(0) : 0;

应该非常清楚Linq提供商提供的内置Linq支持应该如何更好地运行。

Linq是C#和VB.NET的一种语言功能,也可以被任何.NET语言使用,但并不总是使用相同的语言内语法。因此,.NET开发人员应该知道它,并且每个C#和VB.NET开发人员都应该特别了解它(或者他们不知道C#或VB.NET)并且这是NHibernate被设计用于的组,所以他们可以依靠不需要通过Linq方式实现它们来解释一大堆操作。在表示可查询数据的.NET库中不支持它应被视为缺乏完整性; ORM的重点是尽可能使数据库操作尽可能接近使用的编程语言中的非DB相关操作。在.NET中,这意味着Linq支持。

答案 3 :(得分:2)

常识?

像NHibernate这样的ORM与编译器集成方式之间存在差异,以表达在更多场景中使用完整的查询。

或者:使用LINQ(不是LINQ to SQL等等 - 这是你所说的语言,虽然我不确定你的意思是什么)意味着你不必处理Nhibernate特殊查询语法。

或者:任何不使用LINQ的人 - 无论是否使用NHibernate - 都没有合理的解释。

答案 4 :(得分:1)

你不需要它,但你可能会发现它很有用。请记住,正如其他人所说,Linq与Linq to SQL不同。在我工作的地方,我们编写自己的SQL查询来检索数据,但是我们使用Linq来操作数据以满足特定需求是很常见的。例如,您可能有一个数据访问方法,允许您检索Dave拥有的所有狗:

new DogOwnerDal().GetForOwner(id);

如果您只对Dave的daschunds感兴趣,并且性能不是很大的问题,您可以使用Linq将所有Dave狗的响应过滤到您需要的特定数据:

new DogOwnerDal().GetForOwner(id).Where(d => d.Breed == DogBreeds.Daschund);

如果性能至关重要,您可能希望编写一个特定的数据访问方法来按所有者和品种检索狗,但在许多情况下,用于创建新数据访问方法的工作量不足以提高效率值得做

在您的示例中,您可能希望使用NHibernate来检索一块数据,然后使用Linq将这些数据分解为许多单独的子集以进行某种形式的处理。获取数据一次并使用Linq将其拆分可能会更便宜,而不是反复询问数据库中是否有相同数据的不同混合。