A test:
[TestClass]
public class FailingTest
{
[TestMethod]
Test_if_theres_entity_cache_when_cacheable_query_didnt_select_the_whole_entity()
{
// Arrange
var sf = Common.BuildSessionFactory();
using (var session = sf.OpenSession())
{
var q = from c in session.Query<Company>().Cacheable()
select new CompanyDto { CompanyId = c.CompanyId, CompanyName = c.CompanyName, TinyLogo = c.TinyLogo };
q.ToList();
}
// Act
Mapper.NHibernateSQL = "";
using (var session = sf.OpenSession())
{
session.Get<Company>(1); // this won't be able to get an entity cache from the cacheable query above
}
// Assert
Assert.IsTrue(Mapper.NHibernateSQL == ""); // SQL will not be empty
}
}
Output:
Test Name: Test_if_theres_entity_cache_when_cacheable_query_didnt_select_the_whole_entity()
Test Outcome: Failed
Result Message: Assert.IsTrue failed.
NHibernate:
select
company0_.company_id as col_0_0_,
company0_.company_name as col_1_0_,
company0_.tiny_logo as col_2_0_
from
Company company0_
NHibernate:
SELECT
company0_.company_id as company1_2_0_,
company0_.company_name as company2_2_0_,
company0_.company_url as company3_2_0_,
company0_.tiny_logo as tiny4_2_0_
FROM
Company company0_
WHERE
company0_.company_id=:p0;
:p0 = 1 [Type: Int32 (0)]
As you can see, the cached-entity-aware Get was not able to obtain a cached entity from the cacheable query before it. Inefficient
Here's the recommended way:
[TestClass]
public class PassingTest
{
[TestMethod]
public void Test_if_theres_entity_cache_when_cacheable_query_didnt_select_the_whole_entity()
{
// Arrange
var sf = Common.BuildSessionFactory();
using (var session = sf.OpenSession())
{
var q = from c in session.Query<Company>().Cacheable()
select c;
q.ToList().Select(c => new CompanyDto { CompanyId = c.CompanyId, CompanyName = c.CompanyName, TinyLogo = c.TinyLogo });
}
// Act
Mapper.NHibernateSQL = "";
using (var session = sf.OpenSession())
{
session.Get<Company>(1); // this will be able to get an entity cache from the queryable cache above
}
// Assert
Assert.IsTrue(Mapper.NHibernateSQL == ""); // SQL will not be empty
}
}
Output:
Test Name: Test_if_theres_entity_cache_when_cacheable_query_didnt_select_the_whole_entity
Test Outcome: Passed
NHibernate:
select
company0_.company_id as company1_2_,
company0_.company_name as company2_2_,
company0_.company_url as company3_2_,
company0_.tiny_logo as tiny4_2_
from
Company company0_
The session.Get<Company>(1) is able to obtain a cached entity from the cached query before it. Efficient
Happy Coding!
No comments:
Post a Comment