2012-01-13 42 views

回答

3

好了,你不需要LINQ中,你总是可以做,没有它,但你可能想它。

的LINQ提供了一种方式来表达上组数据可以查询,而且我们可以再进行基于该数据的状态等操作行为的操作。它是有意编写的,以便尽可能不区分这些数据是否是内存中的集合,XML,数据库等等。最终,它总是在某种内存对象上运行,并在内存和内存之间进行转换最终来源,尽管一些绑定比其他绑定更推动一些操作进入不同的层次。例如。调用.Count()最终可能会查看Count属性,在集合中旋转并保持计数,向数据库或其他内容发送Count(*)查询。

奥姆斯提供了一种方法以在内存中的对象和数据库中的行反映彼此,以改变一个通过改变到另一个被反射。

即能装进所述位上面的“变换的一些手段”。因此,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(); 

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

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的重点在于尽可能地使数据库尽可能接近正在使用的编程语言中与数据库无关的操作。在.NET中,这意味着Linq支持。

+0

这个答案甚至更好。 – anonymous 2012-01-13 11:37:35

6

LINQ查询语言。它允许您以不与持久层绑定的方式表示查询。

您可能正在考虑LINQ 2 SQLORM

使用LINQ命名二者会导致像您一样的不幸混淆。

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

2

常识?

像NHibernate和编译器集成的方式之间有一个区别,表示在许多情况下使用完整的查询。

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

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

3

首先,LINQ本身并不是一个ORM。无论来源如何,它都是查询对象的DSL。

因此,它使您可以使用LINQ与NHibernate太

非常有意义,我相信你用普通LINQ误解LINQ to SQL

1

你不需要需要它,但你可能会觉得它很有用。请记住,正如其他人所说的,Linq与Linq to SQL不是一回事。在我工作的地方,我们编写自己的SQL查询来检索数据,但是我们通常使用Linq来处理这些数据以满足特定的需求。例如,你可能有一个数据访问方法,使您可以检索由戴夫所拥有的所有的狗:

new DogOwnerDal().GetForOwner(id); 

如果你只在Dave的daschunds一个特定需要感兴趣和性能不算多的一个问题,你可以使用LINQ来过滤所有戴夫的狗的反应到你所需要的具体数据:

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

如果性能是至关重要的,你可能会想要写一个特定的数据访问方法来检索狗通过所有者和品种,但在许多情况下,为创建新的数据访问方法所付出的努力并不能提高效率,因而不值得做。

在你的榜样,您可能需要使用NHibernate的检索数据的疙瘩,然后使用LINQ到的数据分解成很多某种形式处理的个别子的。一次获取数据并使用Linq分割数据可能会更便宜,而不是反复询问数据库中相同数据的不同混合。

相关问题