NHibernate查询只运行一次,然后抛出InvalidCastException



>我有一个简单的查询,如下所示:

var employeeTeam = Session.Query<EmployeeTeam>()
                       .Where(x => x.StartEffective <= competency.FinalDate && // competency.FinalDate is a DateTime
                                   employeesIds.Contains(x.EmployeeId)) // employeeIds is a List<long>
                       .OrderByDescending(x => x.StartEffective)
                       .Select(x => new
                       {
                           x.EmployeeId,
                           x.StartEffective,
                           x.Team
                       }).ToList();

它成功运行一次,但是当第二次(或第三次、第四次等(执行时,它会抛出无效的强制转换异常,如下所示:

致命错误:System.InvalidCastException:无法将类型"System.Linq.EnumerableQuery"1[<>f__AnonymousType0'3[System.Int64,System.DateTime,Team]]">

转换为"System.Collections.Generic.IEnumerable"1[<>f__AnonymousType0'3[System.Int64,System.DateTime,Team]]'。 in NHibernate.Linq.DefaultQueryProvider.Execute[TResult](表达式表达式(

其余的堆栈跟踪被压制为勇敢。

查询始终在出错前在数据库中执行。它不返回任何记录,但它是可以的。如果我重新生成解决方案并再次运行,则查询将再次执行,然后在每次运行时开始引发异常。每次运行其他查询时都会运行,没有任何问题。我不知道是什么原因导致错误。

重要的是要说这段代码是在CSharpCodeProvider环境中运行的,但我不知道它是否能有所作为。

更新

即使使用最简单的查询形式也会发生这种情况:

var employeeTeam = Session.Query<EmployeeTeam>()
                       .Select(x => new
                       {
                           x.Id
                       }).ToList();

它仅在第一次运行正常。但是如果我将 annon 对象从 { x.Id } 更改为 { x.TeamId } ,例如,它在第一次运行时运行正常,然后再次发生异常。

更新 2

我只是意识到,如果我将以下属性添加到 annon 对象,查询每次都有效:

Rnd = (new Random().Next(1, 999))

那么,也许是缓存问题?

更新 3

我将 NHibernate 从 3.3 更新为 4.0.0.4,它解决了几乎所有问题,除了一个查询:

var query = session.Query<Holiday>()
                   .Select(x => new {
                         HoliDayCities = x.City.Select(c => c.Id).ToList(),
                         HoliDayStates = x.State.Select(s => s.Id).ToList(),
    Date = new DateTime((int)(x.Year.HasValue ? x.Year : competencia.InitialDate.Year), (int)x.Month, (int)x.Day)
                   }).ToList();

错误信息:

泛型ADOException:值"{ HoliDayCities = System.Collections.Generic.List'1[System.Int64], HoliDayStates = System.Collections.Generic.List'1[System.Int64], Date = 01/02/2015 00:00:00 }" 不是 "<>f__AnonymousType1'3[System.Collections.Generic.List'1[System.Int64],System.Collections.Generic.List'1[System.Int64],System.DateTime]" 并且不能用于此集合。参数名称:值

如果我如前所述Select作用域添加 Rnd() 函数,它可以正常工作。只有匿名对象才会出现问题。

看起来这是操作匿名类型和 NHibernate 的问题。我强烈建议返回一个简单的结果集,使用 ToList(( 实现结果集,然后对该结果集进行投影。

var employeeTeam = Session.Query<EmployeeTeam>()
                          .Select(x => x)
                          .Where(x => x.Id != 0)
                          .ToList();
var projectedTeam = employeeTeam.Select(x => new {x.Id});
我认为

Nhib LINQ 提供程序不支持将该投影作为延迟执行的一部分。我认为您需要将投影放在 ToList(( 之后

var employeeTeam = Session.Query<EmployeeTeam>()
                   .Where(x => x.StartEffective <= competency.FinalDate &&    // competency.FinalDate is a DateTime
                               employeesIds.Contains(x.EmployeeId)) //  employeeIds is a List<long>
                   .OrderByDescending(x => x.StartEffective)
                   .ToList()
                   .Select(x => new
                   {
                       x.EmployeeId,
                       x.StartEffective,
                       x.Team
                   });

相关内容

  • 没有找到相关文章

最新更新