Можно ли заставить Nhibernate linq генерировать запрос с предложением "В"? например - Where AnID in (x,y,z)
?
Nhibernate Linq In Clause
Ответ 1
Я не знаю состояние nHibernate относительно генерации всех потенциальных запросов LINQ, но вы должны иметь возможность использовать .Contains()
для генерации IN.
var list = new int[] { x, y, x };
var q = db.Entities.Where( e => list.Contains( e.AnID ) );
Ответ 2
Согласовано, это работает. Я обнаружил, что сгенерированный SQL для 'not in' был странным (начиная с 3.3.0 GA)
...
from
mytable t0_
where
case
when t0_.testValue in (
@p0 , @p1 , @p2
) then 1
else 0
[email protected]
@p0 = 9 [Type: Int32 (0)],
@p1 = 99 [Type: Int32 (0)],
@p2 = 109 [Type: Int32 (0)],
@p3 = False [Type: Boolean (0)],
...
Кажется немного странным для случая, когда "не в" было бы яснее (не то, что я планирую читать каждую строку, но, возможно, в трассировке/профиле).
(... позже в тот же день...)
Я понял, что вышеупомянутый "странный" выбор SQL был только тогда, когда я использовал
.Where(e => list.Contains(e.AnID) == false)
Если я использовал
.Where(e => !list.Contains(e.AnID))
Сгенерированный SQL намного чище (используя "не в" )
Ответ 3
NHibernate имеет опцию IsIn часть RestrictionExtensions
x = > x.Name.IsIn(new [] { "a", "b" })