我正在使用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
您是否考慮切換到QueryOver?在新的NH版本中不推薦使用NH2Linq。 – 2011-05-06 13:04:31
@Matías:恕我直言,我不認爲它會改變生成SQL的方式;它仍然需要獲取所有屬性來獲取實體?但現在我不想浪費時間更改一堆代碼,LINQ目前工作良好(除了提到的性能問題)。 – Groo 2011-05-06 13:10:58
但問題是NHtoLinq不再支持了......這只是一個建議:) – 2011-05-06 13:16:35