Почему даже самый простой критерий NHibernate Example не работает? - PullRequest
0 голосов
/ 14 января 2010

Я хочу сделать самую простую работу: получить продукты, которые называют «Картофель».

// 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 возвращает ноль объектов?

EDIT

Нашел решение, основанное на ответе Диего. Я не знал, как показать SQL, сгенерированный NHibernate при использовании Fluent. Вот фрагмент для этого:

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 рассматривает 0s, как говорит Диего.

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>();

1 Ответ

2 голосов
/ 14 января 2010

Они не обязательно равны. Ваш запрос в качестве примера, вероятно, включает в себя некоторые другие поля со значениями по умолчанию (возможно, что-то вроде Active = false).

Вы должны исключить поля, которые вы не любите использовать для фильтра. Хорошее начало - ExcludeZeroes().

В любом случае проверьте полученный SQL. Вы можете сделать это с помощью следующего свойства в вашем конфигурационном файле NHibernate:

<property name="show_sql">true</property>

... Или вы можете использовать такой инструмент, как NHProf, или ваш инструмент для профилирования БД, вывод log4net и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...