Оператор SQL IN в Linq для NHibernate - PullRequest
4 голосов
/ 27 мая 2011

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

        // 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();
        }

Обновление:

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

. List<T>, Array [], Stack работают хорошо.Поэтому я изменяю код на это:

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

Обновление: Сообщение о проблеме: https://nhibernate.jira.com/browse/NH-2762

1 Ответ

7 голосов
/ 28 мая 2011

Поставщик 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...