我有这个Lookup按Symbol对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:Object必须实现IConvertible),我收到了这条信息性错误消息:“无法将参数值从分组转换为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>
,数组[],Stack
效果很好。所以我将代码更改为:
where qwe.ToList().Contains(t.ResultID)
答案 0 :(得分:7)
对于IN子句,NHibernate LINQ提供程序是有限的。它似乎只适用于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();
}