Nhibernate Linq в статье - PullRequest
       26

Nhibernate Linq в статье

21 голосов
/ 30 марта 2010

Можно ли заставить Nhibernate linq сгенерировать запрос с предложением "In"? например - Where AnID in (x,y,z)?

Ответы [ 3 ]

29 голосов
/ 30 марта 2010

Я не знаю состояния nHibernate относительно генерации всех потенциальных запросов LINQ, но вы должны иметь возможность использовать .Contains() для генерации IN.

var list = new int[] { x, y, x };
var q = db.Entities.Where( e => list.Contains( e.AnID ) );
3 голосов
/ 22 апреля 2012

Согласен, это работает. Я обнаружил, что сгенерированный SQL для 'not in' был странным (по состоянию на 3.3.0 GA)

...
from
  mytable t0_
where
  case
    when t0_.testValue in (
              @p0 , @p1 , @p2
          ) then 1
          else 0
    end=@p3
@p0 = 9 [Type: Int32 (0)],
@p1 = 99 [Type: Int32 (0)],
@p2 = 109 [Type: Int32 (0)],
@p3 = False [Type: Boolean (0)],
...

Кажется немного странным для 'case', когда «not in» было бы яснее (не то, чтобы я планировал читать каждую строку, но, возможно, в трассе / профиле).

(... позже в тот же день ...)

Я понял, что вышеуказанный «странный» выбор SQL был только тогда, когда я использовал

.Where(e => list.Contains(e.AnID) == false)

Если бы я использовал

.Where(e => !list.Contains(e.AnID))

Сгенерированный SQL намного чище (с использованием 'not in')

0 голосов
/ 29 мая 2015

В NHibernate есть опция IsIn части RestrictionExtensions

x => x.Name.IsIn (new [] {"a", "b"})

...