在 Linq-to-Nhibernate 中,是否有人设法在 where 子句中使用 .Contains 并在同一查询中使用 NHibernate.Linq.ToFuture() ? (NH 3.x)
每当我尝试在一个查询中使用 .Contains 和 ToFuture() 方法时,我总是会收到一个“System.Collections.Generic.KeyNotFoundException”,提示“字典中不存在给定的键”。
想象一下 DBObject 包含一堆属性,其中一个属性是整数“ID”,
List<int> test = new List<int>();
test.Add(1557);
test.Add(1558);
test.Add(1559);
IEnumerable<DBObject> test2 = getLinqQuerySomehow<DBObject>().Where(x => test.Contains(x.ID)).ToFuture();
List<DBObject> results = test2.ToList();
任何人都可以重现这个吗?有谁知道除了 contains() 之外的另一种方法来使 Linq-to-Nhibernate 对我的测试列表中的整数使用 SQL IN 子句,同时还使用 ToFuture() ?
堆栈跟踪:
在 System.Collections.Generic.Dictionary`2.get_Item(TKey key) 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Param\NamedParameterSpecification.cs 中的 NHibernate.Param.NamedParameterSpecification.SetEffectiveType(QueryParameters queryParameters):第 70 行 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Param\ParametersBackTrackExtensions.cs 中的 NHibernate.Param.ParametersBackTrackExtensions.ResetEffectiveExpectedType(IEnumerable`1parameterSpecs, QueryParameters queryParameters):第 48 行 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Hql\Ast\ANTLR\Loader\QueryLoader.cs 中的 NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.ResetEffectiveExpectedType(IEnumerable`1parameterSpecs, QueryParameters queryParameters) :第 428 行 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs 中的 NHibernate.Loader.Loader.CreateSqlCommand(QueryParameters queryParameters, ISessionImplementor session):第 1649 行 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\MultiQueryImpl.cs 中的 NHibernate.Impl.MultiQueryImpl.AggregateQueriesInformation() 处:第 641 行 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\MultiQueryImpl.cs 中的 NHibernate.Impl.MultiQueryImpl.get_Parameters() 处:第 774 行 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\MultiQueryImpl.cs 中的 NHibernate.Impl.MultiQueryImpl.CreateCombinedQueryParameters() 处:第 754 行 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\MultiQueryImpl.cs 中的 NHibernate.Impl.MultiQueryImpl.List() 处:第 400 行 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\FutureQueryBatch.cs 中的 NHibernate.Impl.FutureQueryBatch.GetResultsFrom(IMultiQuery multiApproach):第 24 行 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\FutureBatch.cs 中的 NHibernate.Impl.FutureBatch`2.GetResults():第 73 行 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\FutureBatch.cs 中的 NHibernate.Impl.FutureBatch`2.get_Results() 处:第 29 行 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\FutureBatch.cs 中的 NHibernate.Impl.FutureBatch`2.GetCurrentResult[TResult](Int32 currentIndex):第 79 行 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\FutureBatch.cs 中的 NHibernate.Impl.FutureBatch`2.c__DisplayClass4`1.b__3() 处:第 63 行 在 d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\DelayedEnumerator.cs 中的 NHibernate.Impl.DelayedEnumerator`1.d__0.MoveNext() 处:第 26 行 在 System.Collections.Generic.List`1..ctor(IEnumerable`1 集合) 在 System.Linq.Enumerable.ToList[TSource](IEnumerable`1 源) 在 C:\checkout\Library Projects\BaseSystemCore\TestProject1\UnitTest1.cs 中的 TestProject1.UnitTest1.TestMethod1() 处:第 94 行
I always get a "System.Collections.Generic.KeyNotFoundException" that says "The given key was not present in the dictionary" whenever I try to use .Contains and the ToFuture() method in one query.
Imagine the DBObject contains a bunch of properties with one of them being an integer "ID"
List<int> test = new List<int>();
test.Add(1557);
test.Add(1558);
test.Add(1559);
IEnumerable<DBObject> test2 = getLinqQuerySomehow<DBObject>().Where(x => test.Contains(x.ID)).ToFuture();
List<DBObject> results = test2.ToList();
Can anyone reproduce this? Does anyone know of another way besides contains() to make Linq-to-Nhibernate use the SQL IN clause for the ints in my test list while also using ToFuture()?
Stacktrace:
at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
at NHibernate.Param.NamedParameterSpecification.SetEffectiveType(QueryParameters queryParameters) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Param\NamedParameterSpecification.cs:line 70
at NHibernate.Param.ParametersBackTrackExtensions.ResetEffectiveExpectedType(IEnumerable`1 parameterSpecs, QueryParameters queryParameters) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Param\ParametersBackTrackExtensions.cs:line 48
at NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.ResetEffectiveExpectedType(IEnumerable`1 parameterSpecs, QueryParameters queryParameters) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Hql\Ast\ANTLR\Loader\QueryLoader.cs:line 428
at NHibernate.Loader.Loader.CreateSqlCommand(QueryParameters queryParameters, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:line 1649
at NHibernate.Impl.MultiQueryImpl.AggregateQueriesInformation() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\MultiQueryImpl.cs:line 641
at NHibernate.Impl.MultiQueryImpl.get_Parameters() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\MultiQueryImpl.cs:line 774
at NHibernate.Impl.MultiQueryImpl.CreateCombinedQueryParameters() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\MultiQueryImpl.cs:line 754
at NHibernate.Impl.MultiQueryImpl.List() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\MultiQueryImpl.cs:line 400
at NHibernate.Impl.FutureQueryBatch.GetResultsFrom(IMultiQuery multiApproach) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\FutureQueryBatch.cs:line 24
at NHibernate.Impl.FutureBatch`2.GetResults() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\FutureBatch.cs:line 73
at NHibernate.Impl.FutureBatch`2.get_Results() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\FutureBatch.cs:line 29
at NHibernate.Impl.FutureBatch`2.GetCurrentResult[TResult](Int32 currentIndex) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\FutureBatch.cs:line 79
at NHibernate.Impl.FutureBatch`2.c__DisplayClass4`1.b__3() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\FutureBatch.cs:line 63
at NHibernate.Impl.DelayedEnumerator`1.d__0.MoveNext() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\DelayedEnumerator.cs:line 26
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at TestProject1.UnitTest1.TestMethod1() in C:\checkout\Library Projects\BaseSystemCore\TestProject1\UnitTest1.cs:line 94
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是一个错误。我在 Nhibernate 问题跟踪器中找到了它:
https://nhibernate.jira.com/browse/NH- 2897
编辑:应该在 NH 4.0 中修复。
This is a bug. I found it in the Nhibernate issue tracker:
https://nhibernate.jira.com/browse/NH-2897
Edit: Should be fixed in NH 4.0.