I was reading this SO question but still I am not clear about one specific thing.
如果我使用NHibernate,为什么我需要LINQ?
当我知道NHibernate还包括LINQ支持时,我脑海中的问题变得更加严重。
LINQ to NHibernate?
WTF!
答案 0 :(得分:6)
LINQ是查询语言。它允许您以不依赖于持久层的方式表达查询。
您可能会考虑LINQ 2 SQL ORM。
使用LINQ命名这两者会导致像你这样的不幸混淆。
nHibernate,EF,LINQ2XML都是LINQ providers - 它们都允许您使用LINQ语法查询数据源。
答案 1 :(得分:3)
答案 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将其拆分可能会更便宜,而不是反复询问数据库中是否有相同数据的不同混合。