NHCBRATE LINQ 3.0 Тип выражения Oracle 10005 не поддерживается этим SelectClauseVisitor - PullRequest
1 голос
/ 11 апреля 2011

У меня следующий запрос LINQ

    QueryResult<List<PersonDemographic>> members = new QueryResult<List<PersonDemographic>>();

    var query = (from ms in this.Session.Query<MemberSummary>()
                 where ms.NameSearch.StartsWith(firstName.ToUpper())
                    && ms.NameSearch2.StartsWith(lastName.ToUpper())
                 select new PersonDemographic
                 {
                     FirstName = ms.FirstName.ToProperCase(),
                     LastName = ms.LastName.ToProperCase(),
                     PersonId = ms.Id,
                     Address = new Address
                     {
                         Line1 = ms.AddressLine1.ToProperCase(),
                         Line2 = ms.AddressLine2.ToProperCase(),
                         City = ms.City.ToProperCase(),
                         State = ms.State,
                         Zipcode = ms.Zipcode,
                     },
                     PhoneNumber = new PhoneNumber
                     {
                          Number = string.IsNullOrWhiteSpace(ms.PhoneNumber) ? null : Regex.Replace(ms.PhoneNumber, @"(\d{3})(\d{3})(\d{4})", "$1-$2-$3")
                     }
                 });

    if (this.Session.Transaction.IsActive)
    {
        members.Data = query.Distinct().Take(15).ToList();
    }
    else
    {
        using (var transaction = this.Session.BeginTransaction())
        {
            members.Data = query.Distinct().Take(15).ToList();                    
            transaction.Commit();
        }
    }   

Код выполняется в разделе транзакции.Если я использую это без Distinct, у меня нет проблем.Добавление Distinct дает мне исключение

{«Этот тип выражения 10005 не поддерживается этим SelectClauseVisitor.»}

Я не могу найти ничего определенного.Кто-нибудь может помочь?

Спасибо, Пол

1 Ответ

0 голосов
/ 12 апреля 2011

В этом запросе есть много вещей, которые NH не может знать, как перевести на SQL:

  • ToProperCase (это похоже на ваш метод расширения)
  • string.IsNullOrWhiteSpace (это новое в .NET 4, NH скомпилирован с 3.5)
  • Regex.Replace (это просто невозможно сделать с SQL, если у вас нет БД, поддерживающей его и написавшей для него диалект)
...