Linq for NHibernate中的SQL IN语句

我有这个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>,Array [],Stack工作得很好.所以我将代码更改为:

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

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

在IN子句中,NHibernate LINQ提供程序是有限的.它似乎只适用于T是简单类型的集合,例如列表与LT;串GT;或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();
}
相关文章
相关标签/搜索