3

使用Linq-to-SQL我想要預取一些數據。使用Linq-to-SQL,IOC和存儲庫模式預取數據

1)常見的解決方案是應對DataLoadOptions,但在我的建築將無法正常工作,因爲:

  • 的選項具有第一查詢
  • 我前設置使用國際奧委會,所以我不直接實例化DataContext的(我不能instanciation執行代碼)
  • 我的DataContext是一個Web請求期間持續

2)我已經看到了另一種可能基於裝載數據及其孩子的的方法,那麼僅返回數據(所以孩子已經裝入)see an example here

然而,在我的建築,它不能不行:

  • 我的查詢級聯了我的倉庫,並且可以通過許多服務消費將增加的條款
  • 我用的接口工作,LINQ到SQL對象的具體情況不離開存儲庫(是的,你c與界面的工作,並增加條款)
  • 我的倉庫是通用

是的,這種架構是安靜複雜,但它非常酷,因爲我可以用樂高積木一樣的代碼打;)

我的問題是:什麼是其他可能性預取數據?

回答

1

在我的應用程序中,我使用了可能的解決方案#2的變體。這是有點難以解釋,但簡單地說:我鏈並推遲延遲加載在我的模型與自定義lazy classes,以抽象從LinqToSql特定的不同執行,我利用IQueryable的優勢。優點:

  • 我的域模型和服務層向上不必依賴於LinqToSql提供商(我可以換我的DAL與接口,如果我願意的話)
  • 我的服務方法可以做回完整具有多個「錨點」的對象圖形,用於使用抽象掉特定延遲加載實現的類來進行延遲加載 - 所以我可以使用LinqToSql特定的不同執行或其他方法(例如,anon delegates,請參閱this answer
  • I可以在整個我的應用程序中保持IQueryable的結果(即使對於用戶界面也是如此),從而允許無限的LINQ查詢鏈接不必擔心性能。
+0

謝謝,這是一個非常有趣的解決方案。它以數據對象爲中心,我發現它更好。不幸的是,它不能回答我當前的需求,因爲我的整個架構都基於延遲加載,並且提取的屬性是例外!然而,我會嘗試基於這種'以數據對象爲中心'的寫作方式創建一個FetchItem 和FetchList ,因爲我非常喜歡它。我正在考慮使用屬性來自動生成我之前說過的'CustomDCParameter'類。如果我找到一個可接受的解決方案(當我有時間處理它時),我會分享。仍然聽好的建議 – Mose 2009-11-09 11:48:01

+0

我想你可能會誤解我 - 當你說'抓''你的意思是立即從數據庫加載?而不是懶/加載延遲? – 2009-11-09 12:38:31

1

我不知道其他的可能性,似乎你已經推動LinqToSql的極限(但我可能是錯的)。

我覺得在這一點上你最好的選擇是:

  1. 添加一些「非一般」的方法,以您的應用程序來處理只是你想要/需要預先加載和不 的 特定場景對這些方法使用您的「普通」,「通用」基礎設施。
  2. 使用ORM具有更復雜的支持以進行急切和延遲加載。
+0

謝謝您的回答 1)我可以把一些非通用代碼,但真正的問題是,我真的希望我的層進行分離。我的查詢由服務層操縱,數據庫調用由它們觸發(透明地),我不想在其中添加特技代碼;) 必須支付鬆耦合:p 2)您可能會對。對於當前的項目來說已經太遲了,但對於下一個項目我會用其他ORM做一些測試。有任何建議嗎?理想情況下符合linq的東西會很棒(我真的很喜歡它) – Mose 2009-10-26 10:00:20

+0

鬆耦合有時會以增加複雜性爲代價。這是你的選擇,你想做出這種折衷。 NHibernate對於加載和延遲加載有着複雜的支持,並且也支持Linq,但也可能有其他ORM滿足這些要求。 – 2009-10-26 11:35:00

0

我找到了解決方案。 我的回答是'依賴注入'。

它通常與IOC一起交付,並且意味着您可以讓您的IOC容器管理實例注入類。

所有我需要的是,當我實例化一個DC中注入CustomDCParameter類。 該類將包含規則,構造函數將應用所有這些規則。