2012-12-19 44 views
1

我正在使用CoolStorage作爲ORM並且有一個關於查詢數據庫頻率的問題。LINQ如何得到它的結果

我要返回一個團隊列表,並且還想顯示每個團隊中包含的用戶數。我通過致電Team.List()返回團隊,並且我可以考慮如何返回用戶數量的2個選項。一種方法是向Team類中添加一個屬性,該類返回其[OneToMany] SysUsers的計數,另一個是對由Team.List()返回的結果使用LINQ。下面的代碼演示了兩種方法,它們都返回相同的結果。

我想了解如何影響數據庫的交互,例如將它先回隊的名單,然後運行對每一個單獨的查詢來獲取用戶的數量?如果我然後想添加另外的2或3個字段,它會爲每個額外的字段運行另一個單獨的查詢嗎?這兩種方法有什麼區別?

我的問題是,如果連接不好,這可能會使簡單的查詢無法響應。

的選項CoolStorage存在運行即席SQL查詢,而不是,我是不是過得更好,而不是做這行更復雜的查詢?還是我擔心什麼都沒有?

CSList<Team> teams = Team.List(); 

// Counting number of objects 
var d = from t in teams 
     select new 
     { 
      TeamID = t.TeamID, 
      TeamName = t.TeamName, 
      NoUsers = t.SysuserTeams.Count 
     }; 

// Using property added to Team class 
var e = from t in teams 
     select new 
     { 
      TeamID = t.TeamID, 
      TeamName = t.TeamName, 
      NoUsers = t.NumberOfUsers 
     }; 

DataGridView dgv = this.dgvTeams; 
dgv.DataSource = d.ToList(); 
// Same result as 
dgv.DataSource = e.ToList(); 
+1

大多數奧姆斯有'Log'財產,或看到正在執行什麼實際的數據庫查詢的一些其他手段。這是查看精確查詢對確切查詢提供者所做的工作的好工具。這對於查看執行查詢的時間,它們的數量以及查詢本身是以更多/更少的信息來查詢需要的還是以其他方式低效的方式很有用。 – Servy

+1

謝謝,我發現了Log屬性,它爲每個返回的行激發一個單獨的select查詢。因此,我猜想我需要爲複雜查詢編寫SQL語句 – CrazyHorse

+1

'我需要爲複雜查詢編寫SQL'不要進行泛化。某些複雜的查詢最終不會被某些ORM有效地映射。您可以嘗試調整在LINQ中如何編寫查詢以更改結果,並且還有可能不同類型的複雜查詢將更有效地映射。 – Servy

回答

1

從SQL日誌在看到正在生成,它是運行在球隊成績每行一個新的查詢,我與CoolStorage開發誰親切地回答一個整潔的解決方案取得了聯繫。

有兩種選擇,或者是OneToMany屬性Sysusers可以被標記爲[Prefetch]或這可以爲每個查詢諸如Team.List().WithPrefecth("Users")被明確指定。無論哪種方式,它現在只能運行在用戶記錄一個額外的查詢,而不是每行查詢