用于 NHibernate 的 Linq 中的 SQL IN 语句

SQL IN statement in Linq for NHibernate

我有这个查找来按符号对 ResultId 进行分组。
我在下面有 Linq 查询,但我不能使用 Contain() 来创建 SQL IN 语句,这是这篇文章 http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to 的状态-sql

1
2
3
4
5
6
7
8
9
        // 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:对象必须实现 IConvertible)后,我收到了这条信息性错误消息:"无法将参数值从分组转换为 Guid"。 qweIGrouping<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 运行良好。所以我把代码改成这样:

1
where qwe.ToList().Contains(t.ResultID)

更新:
报告的问题:https://nhibernate.jira.com/browse/NH-2762


NHibernate LINQ 提供程序在涉及 IN 子句时受到限制。它似乎只适用于 T 是简单类型的集合,例如List<string>List<int>.

这适用于 NHibernate 3.1(未在早期版本中测试):

1
2
3
4
5
6
7
8
9
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();
}