用于NHibernate的Linq中的SQL IN语句



我有这个查找来按符号对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:对象必须实现IConvertable)后,我得到了以下信息性错误消息:"未能将参数值从Grouping转换为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工作良好。所以我把代码改成这样:

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

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

NHibernate LINQ提供程序在IN子句方面受到限制。它似乎只适用于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();
}

相关内容

  • 没有找到相关文章

最新更新