此SelectClauseVisitor不支持NHibernate LINQ 3.0 Oracle表达式类型10005

时间:2011-04-11 15:28:08

标签: oracle nhibernate distinct

我有以下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会给我一个例外

{“此SelectClauseVisitor不支持表达式类型10005。”}

我找不到任何确定的东西。有人可以帮忙吗?

谢谢, 保罗

1 个答案:

答案 0 :(得分:0)

该查询中有很多内容,NH无法知道如何转换为SQL:

  • ToProperCase(看起来像你的扩展方法)
  • string.IsNullOrWhiteSpace(这是.NET 4中的新功能,NH是针对3.5编译的)
  • Regex.Replace(这是不可能用SQL做的,除非你有一个支持它的数据库并为它编写方言)