我刚刚用ASP.Net调查Linq。它确实很整洁。我只是想知道 - 所有课程如何填充?我的意思是在ASP.Net中,假设您有一个名为Catalog的Linq文件,然后使用For循环遍历Catalogue.Products并打印每个产品名称。如何存储细节?它只是在页面加载时通过Products表并为每一行创建另一个Product类实例,有效地将整个表复制到类Product的数组中吗?
如果是这样,我认为我已经创建了一个非常类似的系统,因为有一个SiteContent模块,其中包含每个Manager类的实例 - 例如,有UserManager,ProductManager,SettingManager等。 UserManager包含Users表中每行的User类的实例。它们还包含创建,更新和删除等方法。这些管理器及其“项目”是在每个页面加载时创建的。就我,开发人员而言,这使得在每个页面中访问用户,产品,设置等变得简单易行。我需要创建的任何后续页面,我只需要引用SiteContent.UserManager来访问用户列表,而不是从该页面内执行查询(即此方法将数据访问与页面的工作分开,在与使用后面的代码相同的方式将页面的工作方式与页面的布局方式分开。
然而问题是这种技术似乎相当慢。我的意思是它有效地在每个页面加载时创建一个数据库,从另一个数据库获取数据。我已经采取了一些措施,例如,如果在页面加载时未引用ProductManager,则会阻止创建它。因此,当不需要时,它不会将数据加载到存储中。
我的问题基本上是我的技术是否与Linq完全相同,意思是将表中的数据复制到类的属性中。
提前感谢您对此有任何建议或解答。
此致
理查德克拉克答案 0 :(得分:9)
Linq to SQL不维护数据库中所有数据的副本。它接受通过IQueryable
接口提供它的表达式,读取表达式树,并使用WHERE
和其他SQL结构将它们转换为实际的SQL语句。
换句话说,当你这样写:
var product = context.Products.Where(p => p.ID == 50).SingleOrDefault();
它针对数据库执行此操作:
SELECT ID, Name, Foo, Bar, Baz, Blah, ...
FROM Products
WHERE ProductID = 50
不只需执行SELECT * FROM Products
,然后从结果中搜索特定产品。
如果您尝试在每个页面加载时“下载”整个数据库,那么您的应用程序确实会很慢。这绝对不是Linq to SQL,Linq to Entities或任何其他ORM框架所做的。
答案 1 :(得分:2)
Linq-to-SQL肯定不会“在每个页面加载时创建一个数据库”.....你需要了解Linq-to-SQL的工作原理及其作用。
我的建议:查看“顾”中的multi-part series of blog post - 斯科特格思里 - 并在这些帖子中吸收所有这些智慧。
很多魔术隐藏在视觉设计师的背后,它基本上创造了桌面结构的“快照” - 但只有结构!它知道如何将“gimme that records”查询转换为针对SQL Server后端的直接T-SQL查询。它将这些关系点和片段转换为漂亮的.NET对象。
足够先进的技术总是与魔术几乎无法区分 - 但Linq和Linq-to-SQL真的不是黑魔法 - 只是一些聪明人的非常聪明的代码片段!
答案 2 :(得分:2)
魔术; - )
不,但这很神奇。 LINQ如何工作非常复杂,但我发现我几乎总是使用LINQ获得更好或相同的性能,并且代码始终更清洁。
如果您想使用LINQ,请下载LINQPad并浏览示例。然后购买Joe Albahari(作者的)书,C#4.0在果壳中获取所有血腥细节!
答案 3 :(得分:1)
您需要花一点时间熟悉LINQ语法并了解如何仅提取所需的数据。我建议下载LINQPad ...详细的例子,给你一个漂亮的沙盒,让你的脚湿透。一旦你掌握了基础知识,就会有更多的参与......
答案 4 :(得分:0)
在Linq中,您创建了一个数据上下文,用于管理数据库和对象模型之间的数据更改。
有一些工具,即designer或sqlmetal,允许您在数据库表字段和对象模型之间创建映射。
对于断开连接的模型(如asp.net),您可以使用attach方法来维护字段更新等。
我正在阅读一本关于Linq的非常好的书,名为Linq in Action,它为Linq提供了一个很好的介绍。至于将模型与Linq的模型进行比较,您可能需要进行一些阅读,因为Linq在管理代码级别的对象和将此代码转换为数据层之间执行了大量管理。
使用Linq to SQL,有一个Expression层,它使用非常强烈的数据提供程序将目标代码转换为sql。
Linq使用名为Expression Trees的东西向您公开此表达式图层。然后,您可以在表达式树中修改这些节点,以修改随后在数据层生成的代码。
答案 5 :(得分:0)
LINQ To SQL提供程序与C#编译器相互配合,IQueryable接口在编译时的行为略有不同,而不是内存集合中的标准(IEnumerable)。构建表达式树,this pos t非常有助于理解封面下发生的事情。 LINQ to SQL提供程序接受表达式,而不是Func和动作。有关详细信息,请参阅帖子。
答案 6 :(得分:0)
LINQ to SQL就像许多Object Relationship Mapping解决方案一样,它创建了将表抽象为面向对象实体的对象和集合。您为不同实体创建管理器类的方法有点过分,并且很容易变得难以处理。您可能希望查看使用存储库模式和Domain Driven Design,这实际上意味着您将将与几个高级类关联的实体组合在一起。
答案 7 :(得分:0)
Linq是monad的集合。 monad如何工作由类别理论描述。所以,如果你真的想知道,请查看monad。