我想做最简单的工作:获取名为“Potatoes”的产品。
// solution 1 - Using Expression.Eq
return session.CreateCriteria<Product>().Add(Expression.Eq("Name", "Potatoes")).List<Product>();
// solution 2 - Using Example
Product exampleProduct = new Product();
exampleProduct.Name = "Potatoes";
return session.CreateCriteria<Product>().Add(Example.Create(exampleProduct)).List<Product>();
解决方案1和2应该是相同的,为什么解决方案1返回一个对象而解决方案2返回零对象?
修改
根据Diego的回答找到解决方案。在使用Fluent时,我不知道如何显示由NHibernate生成的SQL。这是一个片段:
[R
eturn Fluently.Configure()
.Database(
MsSqlConfiguration.MsSql2008.ShowSql().ConnectionString(x =>
{
x.TrustedConnection();
x.Server(@"ANDRE-PC\SQLEXPRESS");
x.Database("FluentHibernateTest");
})
).Mappings(m => m.FluentMappings.AddFromAssemblyOf<Program>()).BuildSessionFactory();
在我看到SQL后,很明显NHibernate正在考虑像迭戈所说的那样。
SQL看起来像:
SELECT this_.Id as Id0_0_, this_.Name as Name0_0_, this_.Price as Price0_0_ FROM [Product] this_ WHERE (this_.Name = 'Potatoes' and this_.Price = 0);
修复的解决方案2是:
// solution 2 - Using Example
Product exampleProduct = new Product();
exampleProduct.Name = "Potatoes";
return Session.CreateCriteria<Product>().Add(Example.Create(exampleProduct).ExcludeZeroes()).List<Product>();
答案 0 :(得分:2)
他们不一定平等。您的示例查询可能包括一些其他具有默认值的字段(可能类似Active = false
)。
您应该排除不喜欢用于过滤器的字段。一个好的开始是ExcludeZeroes()
。
在任何情况下,请检查生成的SQL。您可以使用NHibernate配置文件中的以下属性执行此操作:
<property name="show_sql">true</property>
...或者你可以使用像NHProf这样的工具,或者你的数据库分析器工具,log4net输出等。