Nhibernate 3.0 LINQ: проблема с возвратом в IQueryable (не универсальная версия) - не позволяет ToList () - PullRequest
0 голосов
/ 23 ноября 2010

Я использую последний 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.

1 Ответ

1 голос
/ 23 ноября 2010

Не будет ли работать следующее?

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

    }
}
...