Linq for NHibernate中的SQL IN语句

时间:2011-05-27 00:54:11

标签: 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();
        }

更新

重试此代码并深入分析错误后(System.InvalidCastException:Object必须实现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>,数组[],Stack效果很好。所以我将代码更改为:

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

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

1 个答案:

答案 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();
}