Мы использовали NHibernate 2.1, и я обновил нашу систему до 3.0, чтобы протестировать нового поставщика LINQ.Я сравнил провайдера linq, createquery и queryover.
Createquery и queryover сделали почти одно и то же, с одинаковой производительностью.Однако провайдер LINQ сделал ДЕЙСТВИТЕЛЬНО прикольную вещь!
var items = (from m in NHibernateSession.Current.Query<Listing>()
where m.Active == true
select m).Take(10).ToList();
var items2 = NHibernateSession.Current.CreateQuery("from Listing where Active = :val").SetBoolean("val", true).SetMaxResults(10).List();
var items3 = NHibernateSession.Current.QueryOver<Listing>()
.Where(m => m.Active == true)
.Take(10).List();
Sql из createquery & queryover:
select TOP ( 10 /* @p0 */ ) listing0_.PackageID as PackageID13_,
listing0_.MatchComplete as MatchCom2_13_,
listing0_.ExpirationDate as Expirati3_13_,
listing0_.Active as Active13_,
listing0_.Archived as Archived13_,
listing0_.Deleted as Deleted13_,
listing0_.UserID as UserID13_
from Marketplace.Listings listing0_
where listing0_.Active = 1 /* @p1 */
Запрос из LINQ:
select TOP ( 10 /* @p0 */ ) listing0_.PackageID as PackageID13_,
listing0_.MatchComplete as MatchCom2_13_,
listing0_.ExpirationDate as Expirati3_13_,
listing0_.Active as Active13_,
listing0_.Archived as Archived13_,
listing0_.Deleted as Deleted13_,
listing0_.UserID as UserID13_
from Marketplace.Listings listing0_
where case
when listing0_.Active = 1 then 'true'
else 'false'
end = case
when 'True' /* @p1 */ = 'true' then 'true'
else 'false'
end
Продолжительность отNH Profiler для LINQ - 37/91 по сравнению с 2/2
Это должно происходить?Или мне не хватает параметра конфигурации для указания LINQ преобразовывать логические сравнения в бит?
Спасибо