2011-05-06 87 views
1

我正在使用Linq2NHibernate從多個查詢中的表中獲取一堆數據。儘管表格中包含10列,但我在的查詢中僅使用了其中的3個,之後我不需要其他屬性。生成的SQL仍然加載(如預期的)所有屬性在每個查詢上。推薦的優化Linq2NHibernate的方法

什麼是優化查詢的推薦方法?

將較輕的實體變體用於優化查詢有意義嗎?即創建一個只包含2個屬性的實體,並將其映射到同一個表中?如果實際的實體從較輕的實體繼承,它不應該做太多的混亂,NHibernate最終只會獲取較小的數據子集。

這是常見的做法,還是有更好的方法來優化查詢?我寧願堅持使用LINQ,因爲現在在整個項目中都使用它。

[編輯]

麥克下面回答,解決的辦法是很明顯的:實際投射的DTO將決定必要的屬性來獲取。所以,我會提供一個例子,只是爲了更清楚:

換句話說,這個查詢將加載所有屬性:

/* fetch actual entities */ 
var results = session 
    .Query<Food>() 
    .Where(p => p.Proteins < 100 && p.Fats < 50); 

/* ... results in: */ 
SELECT Id, Proteins, Fats, Carbs, Name, Whatever 
FROM [Food] WHERE Proteins < 100 AND Fats < 50 

雖然這一個將產生查詢只獲取規劃特性:

/* fetch light DTOs */ 
var results = session 
    .Query<Food>() 
    .Where(p => p.Proteins < 100 && p.Fats < 50) 
    .Select(p => new 
    { 
     Proteins = p.Proteins, 
     Fats = p.Fats   
    }); 

/* generated sql: */ 
SELECT Proteins, Fats 
FROM [Food] WHERE Proteins < 100 AND Fats < 50 
+1

您是否考慮切換到QueryOver?在新的NH版本中不推薦使用NH2Linq。 – 2011-05-06 13:04:31

+0

@Matías:恕我直言,我不認爲它會改變生成SQL的方式;它仍然需要獲取所有屬性來獲取實體?但現在我不想浪費時間更改一堆代碼,LINQ目前工作良好(除了提到的性能問題)。 – Groo 2011-05-06 13:10:58

+0

但問題是NHtoLinq不再支持了......這只是一個建議:) – 2011-05-06 13:16:35

回答

1

由於您尚未發佈實際查詢,因此很難看出問題所在。通常,您只需填寫所需字段的數據傳輸對象(DTO)。這將解決一個問題。至於包括您的域實體中的每個字段的LINQ查詢,您必須使用投影。預測會告訴NHibernate只能獲取那些不包括其他域的信息。請注意,我不用LINQ查詢NHibernate,但概念是相同的。

另外我同意MatíasFidemraizer,您應該考慮使用新的QueryOver API。

+0

謝謝,我完成了我的文章後就明白了。這實際上很明顯,它傷害了我的眼睛。 :)關於QueryOver,現在我沒有看到重構整個應用程序的重點,因爲它是「推薦」切換。現在LINQ已經足夠穩定了,至少對於我需要的東西來說。代碼重構良好,鬆散耦合,並且我從NHibernate獲得了我需要的所有ORM優勢。我檢查了所有發出的SQL以關注發生的事情。 – Groo 2011-05-06 14:06:51