2010-03-19 43 views
5

我剛剛用ASP.Net查看Linq。它確實非常整潔。我只是想知道 - 所有的課程如何填充?我的意思是在ASP.Net中,假設您有一個名爲Catalog的Linq文件,然後使用For循環來遍歷Catalogue.Products並打印每個產品名稱。細節如何存儲?它是否僅通過頁面加載時的Products表併爲每行創建另一個Product類的實例,從而有效地將整個表複製到類Product的數組中?Linq - 它是如何工作的?

如果是這樣,我認爲我已經創建了一個非常像這樣的系統,就是說有一個帶有每個Manager類實例的SiteContent模塊 - 例如有UserManager,ProductManager,SettingManager等。 UserManager包含Users表中每行的User類的一個實例。它們還包含創建,更新和移除等方法。這些管理器及其「項目」是在每個頁面加載時創建的。就我而言,開發人員而言,這使得訪問每個頁面中的用戶,產品,設置等變得非常簡單。任何後續我需要創建的頁面,我只需要引用SiteContent.UserManager來訪問用戶列表,而不是從該頁面內執行查詢(即,此方法將數據訪問從頁面的工作中分離出來,與使用後面的代碼相同的方式將頁面的工作與頁面的佈局分開)。

然而,問題是這種技術似乎相當緩慢。我的意思是它有效地創建每個頁面加載數據庫,從另一個數據庫中獲取數據。我採取了一些措施,比如阻止ProductManager在頁面加載時未被引用時被創建。因此,它不會在不需要時將數據加載到存儲中。

我的問題是我的技術基本上做是否完全一樣的東西LINQ中,在複製從表中的數據到的類屬性的意義..

預先感謝這個任何建議或答案。

問候,

理查德·克拉克

+2

LINQ與LINQ-to-SQL不一樣。 – SLaks 2010-03-19 20:41:17

+0

嘿所有, 感謝您的所有答案。他們中的大多數都包含有用的信息,工具(如LinqPad)或書籍(如Linq in Action) - 我一定會進一步研究這些。正如我在對Aaronaughts回答的評論中所說的,我可能沒有時間在我的項目中實施Linq,但我肯定會爲我的論文做大量的研究。如果任何人有更多的意見要添加 - 比如我可能感興趣的其他書籍或網站,他們有很好的經驗,那麼請說出來 - 我也一定會考慮他們。再次感謝。 Regards, Richard – ClarkeyBoy 2010-03-19 22:08:41

回答

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

+1好聽的解釋! – 2010-03-19 20:33:10

+0

只需補充一點:那就是我近20年前使用的技術。 10年前在C#上。沒有什麼新鮮事,圍繞它的文獻很多。 – TomTom 2010-03-19 20:40:33

+0

感謝您的回覆。我想也許這個答案以我能夠輕易理解的方式向我解釋(不是說我不能理解其他答案..)。因爲我的整個項目(和論文)在不到兩個月的時間內完成了,而且還沒有做過很多論文:(這是我可以輕易評論的內容,因爲我會改變它如果我有時間 感謝所有的答案 - 。?。大加讚賞 問候, 理查德 – ClarkeyBoy 2010-03-19 21:57:06

0

在LINQ,您可以創建用於管理數據庫和對象模型之間的數據變化的數據上下文。

有一些工具,即設計師或sqlmetal,允許您創建數據庫表字段和對象模型之間的映射。

在斷開連接的模型的情況下,如asp.net可以使用連接方法來維持現場更新等

我正在讀LINQ的一個非常好的書在行動稱爲LINQ的,它提供了一個很好的Linq介紹。至於將你的模型與Linq做的比較,你可能需要做一些閱讀,因爲Linq在代碼級別管理對象和將代碼轉換爲數據層之間執行了相當多的管理。

使用Linq to SQL,有一個Expression層可以使用非常強烈的數據提供程序將目標代碼轉換爲sql。

Linq使用稱爲表達式樹的東西將此表達式層展示給您。然後可以修改表達式樹中的這些節點,以修改在數據層生成的代碼。

1

您將需要花一點時間熟悉LINQ語法並瞭解如何僅提取所需的數據。我建議下載LINQPad ...詳細的例子,並給你一個很好的沙箱玩,讓你的腳溼。一旦你掌握了基本知識,就有時間去獲得更多的參與......

+0

+1鏈接到LinqPad ...看起來像一個不錯的工具。 – 2010-03-19 20:33:33

0

LINQ To SQL提供程序與C#編譯器相互勾結,IQueryable接口在編譯時行爲有點不同,與內存集合中的標準(IEnumerable)相反。表達樹被構建,this pos t對理解封面下面發生的事情非常有幫助。 LINQ to SQL提供程序接受表達式,而不是函數和操作。詳情請看帖子。

+0

合謀除非你包括每一個.NET編譯語言,也是每個LINQ提供程序(如LinqToEntities)然後 – 2010-03-19 20:46:58

+0

沒有意識到這是一個關於語義的論壇 – kd7 2010-03-19 20:50:31

2

Linq-to-SQL絕對不會「在每個頁面加載時創建一個數據庫」.....你需要了解Linq-to-SQL的工作方式以及它的功能。

我的推薦:查看「The Gu」 - Scott Guthrie的multi-part series of blog post - 並在那些帖子中吸收所有智慧。

很多魔法都隱藏在視覺設計師後面,它基本上創建了表格結構的「快照」 - 但僅限於結構!它知道如何將你的「給我這些記錄」查詢轉換成針對SQL Server後端的直接T-SQL查詢。它將這些關係位和片段轉換成很好的.NET對象。有足夠先進的技術總是與魔法幾乎沒有什麼區別 - 但Linq和Linq-to-SQL確實不是黑魔法 - 只是一些聰明人的非常聰明的代碼段!

+0

Pop在Reflector中打開ObjectReaderCompiler,試着告訴我所有那些'Emit'調用都是黑魔法的東西 – Aaronaught 2010-03-19 20:52:03

+0

@ Aaronaught:好的,*大多數* LINQ和Linq-to-SQL實際上沒有黑魔法 - 有些部分可能是:-) – 2010-03-20 08:03:00

0

LINQ to SQL就像許多Object Relationship Mapping解決方案一樣,創建將表抽象爲面向對象實體的對象和集合。您爲不同實體創建管理員類的方法有點過分,並且會很容易變得笨拙。您可能需要查看使用Repository Pattern和Domain Driven Design,這實際上意味着您將將關聯的實體組合到一對高級類中。

2

魔法;-)

不,但它很神奇。 LINQ是如何工作的相當複雜,但我發現我幾乎總是可以用LINQ獲得更好或相同的性能,代碼是總是更清潔。

如果你想玩LINQ,請下載LINQPad並通過示例。然後購買Joe Albahari(作者)的書,C#4.0 In a Nutshell,瞭解所有血腥細節!

+0

+1:對於LinqPad! – 2010-03-19 21:17:10

0

Linq是monads的集合。類別理論描述了monad的工作原理。所以如果你真的想知道,請查找單子。

相關問題