有沒有在NHibernate中檢查數據庫中是否存在對象而不必獲取/加載對象的方法?檢查數據庫中是否存在沒有用NHibernate加載對象的數據庫
回答
總是可以做一個計數。
我傾向於使用DetachedCriteria之後,所以我有這樣的:
var criteria = // some criteria that will identify your object
var result = criteria
.GetExecutableCriteria(Session)
.SetProjection(Projections.RowCountInt64())
.UniqueResult();
return result > 0;
我認爲你正在尋找這...
var fooExists = session.Query<Foo>().Any(f => /*condition*/);
這應該是var fooExists = session.Query
@DariusKucinskas,這是不正確的。這兩個構造都導致了EXACT SAME SQL。使用'Any(x)'而不是'Where(x).Any()'只是更簡潔一些。 – 2012-06-27 15:59:24
任何一個都不好,因爲它提取實體表單數據庫,在這種情況下行數更好。 – 2012-06-28 06:23:05
var exists = 1 == session.CreateQuery("select 1 from MyEntity where Property = :value")
.SetValue("value", xxx)
.UniqueResult<Int32?>();
您可以使用以下3個查詢之一(或者你可以從使用標準API Projections.RowCountInt64()大衛回答):
bool exist = session.Query<Employee>()
.Any(x => x.EmployeeID == 1);
bool exist = session.QueryOver<Employee>()
.Where(x => x.EmployeeID == 1)
.RowCount() > 0;
bool exist = session.Query<Employee>()
.Count(x => x.EmployeeID == 1) > 0;
請記住,任何是這三個中最糟糕的,因爲它提取實體。下面是每個生成的SQL查詢:
exec sp_executesql N'select TOP (1) employee0_.EmployeeID as EmployeeID0_, employee0_.Name as Name0_ from Employee employee0_ where [email protected]',N'@p0 int',@p0=1
exec sp_executesql N'SELECT count(*) as y0_ FROM Employee this_ WHERE this_.EmployeeID = @p0',N'@p0 int',@p0=1
exec sp_executesql N'select cast(count(*) as INT) as col_0_0_ from Employee employee0_ where [email protected]',N'@p0 int',@p0=1
OTOH,從性能的角度來看,任何一個都可能是最好的 - 根據數據量,索引等,「count」可能是一個繁重的函數。 TOP(1)只會尋求適當的索引。是否有相當於'SELECT TOP(1)1 FROM table WHERE ...'這將再次最好(因爲它實際上不會從表中抽取任何數據)。 – 2012-08-23 11:31:02
+1查看詳細分類。 – JasonCoder 2013-07-18 17:01:32
查看我的答案,查詢不會獲取實體或使用計數。 http://stackoverflow.com/a/24083783/12752 – 2014-06-06 14:07:35
要擴大大流士Kucinskas'優秀的答案,你能避免使用選擇獲取實體:
bool exist = session.Query<Employee>()
.Where(x => x.EmployeeID == 1)
.Select(x => x.EmployeeID)
.Any();
如前所述,查詢性能應該是相同的但我希望這可以減少網絡流量。
根據Ricardo答案,這似乎是使用HQL檢查對象是否存在的最有效方法。它不計算,並不一定會加載對象:
var exists = session
.CreateQuery("select 1 from Widget where _color = 'green'")
.SetMaxResults(1)
.UniqueResult<Int32?>()
.HasValue;
它生成此SQL(注意,這是SQLite的,所以限制,而不是TOP)
select
1 as col_0_0_
from
Widgets
where
Color='green' limit 1;
你可以試試:
public virtual T FindById<T>(int id)
{
return session.Get(typeof(T), id));
}
所以我讓自己做一些測試與你的例子@Jamie Ide @Darius Kucinskas @Dmitry
所以:
var exists = session
.CreateQuery("select 1 from Widget where _color = 'green'")
.SetMaxResults(1)
.UniqueResult<Int32?>()
.HasValue;
在我的情況
爲18%快於
bool exist = session.Query<Employee>()
.Any(x => x.EmployeeID == 1);
14%比
bool exist = session.Query<Employee>()
.Count(x => x.EmployeeID == 1) > 0;
和8%
bool exist = session.QueryOver<Employee>()
.Where(x => x.EmployeeID == 1)
.RowCount() > 0;
所以,在我看來,即使硬編碼的查詢是最快的
bool exist = session.QueryOver<Employee>()
.Where(x => x.EmployeeID == 1)
.RowCount() > 0;
是最好的選擇,因爲良好的生活習慣和代碼清晰
- 1. 檢查數據庫中是否存在數據庫
- 2. flask sqlalchemy檢查數據庫中是否存在對象
- 3. Linq - 如何檢查數據庫中是否存在對象
- 4. MySQL檢查數據庫是否存在
- 5. JavaDB - 檢查數據庫是否存在
- 6. 檢查SQLite數據庫是否存在
- 7. 檢查數據庫是否存在
- 8. 檢查數據庫表中是否存在已有的數字?
- 9. 檢查數據庫中是否存在數據
- 10. 如何檢查數據庫中是否存在數據?
- 11. 紅寶石檢查數據庫中是否存在數據
- 12. 如何檢查對象是否已保存到數據庫
- 13. 如何使用NHibernate檢查數據庫中是否存在具有給定ID的對象?
- 14. 如何檢查數據庫是否存在,該數據庫的用戶有權連接該數據庫 - Laravel
- 15. 如何檢查數據庫中是否存在值對?
- 16. 檢查數據庫中是否存在使用查詢> NodeJS
- 17. 檢查數據庫是否有記錄
- 18. 檢查是否沒有在MySQL數據庫中找到結果
- 19. 檢查數據是否存在於數據庫VB.Net
- 20. 檢查MySQL數據庫數據是否不存在
- 21. 如何檢查數據庫中是否有相同的數據?
- 22. 如何在2表中插入數據並檢查數據庫中是否存在數據庫中存在php
- 23. 如何檢查Hibernate是否在加載數據時使用數據庫索引
- 24. 檢查數組中的值是否已經存在於數據庫中+將數組添加到數據庫中
- 25. 檢查數據庫中是否有更改沒有回發
- 26. 檢查數據庫中的用戶名是否存在
- 27. 檢查用戶數據是否已經在數據庫中
- 28. 使用SQL檢查數據庫中是否存在用戶
- 29. 檢查用戶是否登錄在數據庫中存在
- 30. 檢查是否存在具有指定名稱的數據庫
我不明白。如果數據庫中沒有對象,如何獲取或加載對象。該對象應該返回爲空。或者你的結果列表將是空的。 – 2010-08-19 20:16:26