Вопрос

Я пытаюсь создать not in Пункт с критериями NhiBernate Criteriabs с использованием NHLABLABLABDAEXTIONSIONS. Чтение документации, я смог реализовать in пункт, делая

.Add(SqlExpression.In<Zone>(z => zoneAlias.ZoneId, new int[] { 1008, 1010 }))

Однако, когда я обернутую это SqlExpression.Not Я получаю ошибку

Error   5   The best overloaded method match for 'NHibernate.LambdaExtensions.SqlExpression.Not<oms_dal.Models.Zone>(System.Linq.Expressions.Expression<System.Func<oms_dal.Models.Zone,bool>>)' has some invalid arguments
Error   6   Argument '1': cannot convert from 'NHibernate.Criterion.ICriterion' to 'System.Linq.Expressions.Expression<System.Func<oms_dal.Models.Zone,bool>>'

Я использую этот кусок кода

.Add(SqlExpression.Not<Zone>(SqlExpression.In<Zone>(x => zoneAlias.ZoneId, new int[] { 1008, 1010 })))

Как я могу сделать это? Используя обычные критерии API, я смог сделать это

.Add(Restrictions.Not(Restrictions.In("z.ZoneId", new[] { 1008, 1010 })))
Это было полезно?

Решение

Не работал с критерием напрямую (я вообще использую Linq2nh), но похоже, что не просто хочет булевой лямбда, поэтому вы не можете дать ему другой критерий. Это может работать, хотя я видел, чтобы иметь проблемы с членами массива в лямбдасе:

.Add(SqlExpression.Not<Zone>(z=>new[]{1008,1010}.Contains(z.ZoneId))

Редактировать: дерьмо. Здесь происходит то, что рамки на самом деле не используют лямбда, поэтому, в то время как это компилирует, каркас никогда не называет ее в процессе выполнения запроса. Вместо этого является отражающимся рассмотрением MSIL вашего делегата, обратная инженерия вашего лямбда и преобразует это в строку для команды SQL. То есть, очевидно, довольно сложный процесс, который дизайнеры пытаются упростить, когда вы указываете подсказки о том, что вы делаете (в этом случае, тип SQLExpression вы объявили) и ищу шаблонов для идентификации процесса. В этом случае, хотя даже учитывая подсказки, рамки не знают, что вы пытаетесь сделать.

Если переводчик позади оценки не () пунктов не может божению цели логических петель или вызовы методов, вы вполне можете застрять с

.Add(SqlExpression.Not<Zone>(z=>z.ZoneId == 1008
                                || z.ZoneId == 1010))

Goodlity знает, что мне приходилось кипеть выражениями вниз таким образом для Linq2nibernate работать правильно.

Другие советы

Использование старого мира с лямбдасом, кажется, работает:

.Add(Expression.Not(SqlExpression.In<Zone>(z => zoneAlias.ZoneId, new int[] { 1008, 1010 }));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top