C # странное поведение лямбда - PullRequest
8 голосов
/ 08 февраля 2011

Может ли кто-нибудь указать, почему это может происходить:

Я использую NHibernate и поставщика Linq для него.

Код, который не работает, указан здесь:

var sequence = session.Query<T>();

var wtfSequence = sequence.Where(x => true);
var okaySequence = sequence.Where(x => x.Id > 0);

Отладка показывает, что sequence (то есть IQueryable<T>) после этого содержит 2 элемента, которые были добавлены в базу данных.

Я ожидаю, что первое Where выражение выдаст все элементы из этой последовательности, но, к сожалению, оно оставляет 0 элементов.

(ПОЧЕМУ ???)

Второе утверждение Where, напротив, фактически выдает 2 элемента, как и должно работать.

Вот NHibernate -> Sqlite запросы для первого и второго Where операторов.

NHibernate: select cast(count(*) as INTEGER) as col_0_0_ from "BinaryUnitProxy_IndicatorUnitDescriptor" binaryunit0_ where @p0='true';@p0 = 'True' [Type: String (0)]

NHibernate: select cast(count(*) as INTEGER) as col_0_0_ from "BinaryUnitProxy_IndicatorUnitDescriptor" binaryunit0_ where binaryunit0_.Id>@p0;@p0 = 0 [Type: Int32 (0)]

Теперь, если я протестирую тот же код с моим InMemoryRepository, который хранит все сущности в простом списке, (x => true) прекрасно работает.

Итак - почему это происходит при использовании NHibernate?Это ошибка или я что-то не так делаю?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 08 февраля 2011

Я не знаю NHibernate, но проблема очевидна из сгенерированного SQL: ваша база данных не считает true (строчные буквы t) равными True (прописными буквами T).В SQL-сервере вы можете изменить это, изменив параметры сортировки базы данных (что является действительно плохой идеей, если вы не хотите учитывать регистр по другим причинам).

Я предполагаю, что это ошибка в NHibernate, которую необходимо обойти.,Протестируйте t => 1 == 1 вместо t => true, что может работать в зависимости от того, как написан код NHibernate.

2 голосов
/ 08 февраля 2011

Я предполагаю, что это ошибка в NHibernate, основанная на выводе SqLite, который вы показываете. Вы можете попробовать X => X.Id == X.Id вместо X => true и посмотреть, сработает ли это.

1 голос
/ 08 февраля 2011

Похоже, ошибка для меня. Он преобразует логическую операцию в вычисление строки, и даже если он облажался, так как он устанавливает запрос с помощью true и оценивает с помощью True, поэтому проверка с учетом регистра не будет выполнена.

...