我有这个查找来按符号对ResultId进行分组。我在下面有Linq查询,但我不能通过使用Contain()来生成SQL IN语句,这是本文的状态http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql
// This will group ResultIds (Guid) by their symbol (string).
var asd = ResultIdsAndSymbols.ToLookup(x => x.Symbol, y => y.ResultID);
foreach (var qwe in asd)
{
var Numbers = (from t in Session.Query<TableName>()
where qwe.Contains(t.ResultID)
select t.Number).ToList();
}
更新:
在重试此代码并深入分析错误(System.InvalidCastException:对象必须实现IConvertable)后,我得到了以下信息性错误消息:"未能将参数值从Grouping转换为Guid"。qwe
是IGrouping<string, Guid>
的一种类型,它将变成IEnumerable<Guid>
,这应该不会像我们将其传递到List
构造函数或在foreach
语句中使用那样成为问题。System.Data.SqlClient
中引发的异常。我认为NHibernate只是将Grouping<TKey, TElement>
传递到导致错误的sql参数中。NHibernate应该被设计为枚举到任何IEnumerable<T>
并生成SQL IN查询,就像它对List<T>
所做的那样。
List<T>
、Array[]、Stack
工作良好。所以我把代码改成这样:
where qwe.ToList().Contains(t.ResultID)
更新:报告的问题:https://nhibernate.jira.com/browse/NH-2762
NHibernate LINQ提供程序在IN子句方面受到限制。它似乎只适用于T是简单类型的集合,例如List<string>
或List<int>
。
这适用于NHibernate 3.1(未在早期版本中测试):
var asd = ResultIdsAndSymbols.ToLookup(x => x.Symbol, y => y.ResultID);
foreach (var qwe in asd)
{
List<int> list = qwe.ToList();
var Numbers = (from t in Session.Query<TableName>()
where list.Contains(t.ResultID)
select t.Number).ToList();
}