2011-05-27 3 views
4

У меня есть этот поиск в группе ResultId по символу. У меня есть Linq запрос ниже, но я не могу сделать SQL в выписке с помощью Содержать(), который является состоянием этой должности http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sqlЗаявление SQL IN в Linq для NHibernate

 // This will group ResultIds (Guid) by their symbol (string). 
     var asd = ResultIdsAndSymbols.ToLookup(x => x.Symbol, y => y.ResultID); 

     foreach (var qwe in asd) 
     { 
      var Numbers = (from t in Session.Query<TableName>() 
         where qwe.Contains(t.ResultID) 
         select t.Number).ToList(); 
     } 

Update:

После повтора этого кода и глубокого анализа ошибки (System.InvalidCastException: объект должен реализовать IConvertible), я получил это информативное сообщение об ошибке: «Не удалось преобразовать значение параметра из группировки в указатель». qwe - это тип IGrouping<string, Guid>, и он станет IEnumerable<Guid>, который не должен быть проблемой, как мы передаем это в конструктор или используется в инструкции foreach. Исключение составляет System.Data.SqlClient. Я думаю, что NHibernate просто передает Grouping<TKey, TElement> в параметр sql, который вызывает ошибку. NHibernate должен быть предназначен для перечисления на любой номер IEnumerable<T> и генерации запроса SQL IN так же, как и для List<T>.

List<T>, Array [], Stack хорошо работать. Так что я изменить код для этого: сообщил Issue::

where qwe.ToList().Contains(t.ResultID) 

Update https://nhibernate.jira.com/browse/NH-2762

+0

В докладе ссылка вопрос вы предоставили не работает. –

+1

Наверное, они переезжают в облако Джира. Я обновляю ссылку, но это не популярная ошибка, и они просто не разрешены. Однако @Aaronaught сказал, что он исправлен на v3.2 ниже. – CallMeLaNN

+0

Ссылка работает ОК – PandaWood

ответ

7

провайдер NHibernate LINQ ограничен, когда речь идет о предложении IN. Кажется, что он работает только с коллекциями, где T - простой тип, например. List<string> или List<int>.

Это работает в NHibernate 3.1 (не тестировался в более ранних версиях):

var asd = ResultIdsAndSymbols.ToLookup(x => x.Symbol, y => y.ResultID); 

foreach (var qwe in asd) 
{ 
    List<int> list = qwe.ToList(); 
    var Numbers = (from t in Session.Query<TableName>() 
       where list.Contains(t.ResultID) 
       select t.Number).ToList(); 
} 
+0

Я пробовал использовать простой массив или общий список. Я помню, что это что-то вроде SQL-запроса пустым или недоступным (SQL-запрос никогда не генерируется). Я также использую nhibernate 3.1! Почему ты можешь. – CallMeLaNN

+0

@CallMeLaNN Не могли бы вы выслать код и точную ошибку? Я готов помочь разрешить это, но мне нужно воспроизвести ошибку для этого. –

+0

Требуется некоторое время, чтобы связаться с кодом в ветке. Однако я не могу воспроизвести ошибку. Теперь повторное выполнение кода произошло только для типа «Lookup». для другого списка коллекция или массив не возникли проблемы. Благодарю. – CallMeLaNN

Смежные вопросы