Nhibernate 3.0 LINQ: проблема с возвратом в IQueryable (не общая версия) - не позволяет ToList ()

Я использую последнюю версию Nhibernate, и у меня есть запрос linq, чтобы вернуть только 1 столбец. поэтому я не могу использовать, например, IQueryable, поскольку нет класса сущности - я возвращаю только 1 столбец. Но возврат к версии IQueryable Non Generic не предоставляет метод ToList

Вот метод

    public IQueryable GetCode()
    {
        using (ITransaction transaction = _session.BeginTransaction())
        {

            var results = (from c in _session.Query<Client>()
                           select new
                           {
                               Group = c.Code
                           }).Distinct();

        }
    }

Конечно, если я сделаю это (см. Ниже), я получу метод ToList на моем IQueryable

    public IQueryable<Client> GetCode()
    {
        using (ITransaction transaction = _session.BeginTransaction())
        {

            var results = (from c in _session.Query<Client>()
                           select c;

        }
    }

Проблема в том, что мне нужно сделать DISTINCT и использовать только 1 столбец.

Любые идеи, я в недоумении

заранее спасибо

ИЗМЕНИТЬ

Когда я смотрю на тип, возвращаемый через IQueryable, это

{NHibernate.Linq.NhQueryable ‹----------------> f__AnonymousType6>}

и глядя под базовый класс того, что возвращается, я вижу исключение

Тип выражения 10005 не поддерживается этим SelectClauseVisitor.


person Martin    schedule 23.11.2010    source источник
comment
Почему вы оборачиваете транзакцию (которая просто удаляется) вокруг запроса? Это звучит проблематично по нескольким причинам.   -  person Paco    schedule 23.11.2010
comment
Да, Пако, ты прав, но это не решает проблему   -  person Martin    schedule 23.11.2010


Ответы (1)


Разве следующее не сработает?

public IQueryable<X> GetCode() // X = the type of Client.Code
{
    using (ITransaction transaction = _session.BeginTransaction())
    {

        var results = (from c in _session.Query<Client>()
                       select c.Code).Distinct();

    }
}

Проблема здесь не только в том, что вы не можете вызвать ToList для неуниверсального IQueryable, но и в том, что весь результат не типизирован, поэтому вы также не можете прочитать свойство Code каждого элемента. (Это можно обойти с помощью динамического типа C # 4, но это не совсем то, что вам здесь нужно.)

В вашем случае я не понимаю, почему вам действительно нужно создавать анонимный тип только для того, чтобы возвращать отдельную последовательность значений Code, переименованных в Group. Достаточно вернуть значение поля.

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

public IQueryable<ClientGroupAndSomething> GetCode()
{
    using (ITransaction transaction = _session.BeginTransaction())
    {

        var results = (from c in _session.Query<Client>()
                       select new ClientGroupAndSomething
                       { 
                           Group = c.Code, 
                           ... 
                       }).Distinct();

    }
}
person Ruben    schedule 23.11.2010
comment
Спасибо, Рубен! Есть ли другой способ вернуть более 1 столбца? Должен ли я создать явный тип? - person Martin; 23.11.2010
comment
Всегда есть обходные пути, например, использование возвращаемого типа IQueryable<dynamic> (C # 4), а не простого IQueryable. Хотя я не знаю, поддерживает ли это NHibernate. И тогда вы больше не работаете со статически типизированным кодом (проверено компилятором). Неуниверсальный IQueryable стирает информацию статического типа, поэтому у вас есть запрос, возвращающий элементы неизвестного типа. По этой причине анонимные типы (new {...}) никогда не должны избегать метода. - person Ruben; 23.11.2010
comment
Спасибо! Отлично ... очень признателен - person Martin; 24.11.2010