Linq for NHibernate中的SQL IN语句

Cal*_*aNN 4 linq nhibernate

我有这个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();
        }
Run Code Online (Sandbox Code Playgroud)

更新:

重试此代码并深入分析错误(System.InvalidCastException:Object必须实现IConvertible)后,我收到了这条信息性错误消息:"无法将参数值从分组转换为Guid".qwe是一种类型的IGrouping<string, Guid>,它将成为IEnumerable<Guid>不应该是一个问题,如我们将其传递给List构造函数或在foreach语句中使用.抛出的异常System.Data.SqlClient.我认为NHibernate只是将Grouping<TKey, TElement>sql参数传递给导致错误的sql参数.应该将NHibernate设计为枚举到任何IEnumerable<T>并生成SQL IN查询,就像它的用途一样List<T>.

List<T>,[]数组,Stack做工精良.所以我将代码更改为:

where qwe.ToList().Contains(t.ResultID)
Run Code Online (Sandbox Code Playgroud)

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

Flo*_*Lim 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();
}
Run Code Online (Sandbox Code Playgroud)