【问题标题】:SQL IN statement in Linq for NHibernate用于 NHibernate 的 Linq 中的 SQL IN 语句
【发布时间】:2011-05-27 00:54:10
【问题描述】:

我有这个查找来按符号对 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 must implement IConvertible)后,我收到了这条信息性错误消息:“无法将参数值从 Grouping 转换为 Guid” . qweIGrouping&lt;string, Guid&gt; 的一种类型,它将变为 IEnumerable&lt;Guid&gt;,这应该不是问题,就像我们将其传递给 List 构造函数或在 foreach 语句中使用一样。 System.Data.SqlClient 中抛出的异常。我认为 NHibernate 只是将 Grouping&lt;TKey, TElement&gt; 传递给导致错误的 sql 参数。 NHibernate 应该被设计为枚举到任何 IEnumerable&lt;T&gt; 并生成 SQL IN 查询,就像它为 List&lt;T&gt; 所做的那样。

List&lt;T&gt;、Array[]、Stack 运行良好。所以我把代码改成这样:

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

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

【问题讨论】:

  • 您提供的问题报告链接失效。
  • 他们可能会迁移到 Jira 云。我更新了链接,但它不是一个流行的错误,他们只是把未解决的。但是@Aaronaught 说它在下面的 v3.2 上已修复。
  • 链接现在可以正常工作了

标签: linq nhibernate


【解决方案1】:

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

这适用于 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();
}

【讨论】:

  • 我尝试使用简单数组或泛型列表。我记得它会抛出类似 SQL 查询为空或不可用(从未生成 sql 查询)之类的东西。我也使用nhibernate 3.1!为什么可以。
  • @CallMeLaNN 你能发布代码和你得到的确切错误吗?我愿意帮助解决这个问题,但我需要能够重现该错误。
  • 接触分支中的代码需要一段时间。但是我无法重现该错误。现在重试代码只发生在Lookup 类型。对于其他列表,集合或数组没有问题。谢谢。
  • 它不应该只适用于集合,而是任何实现IEnumerable&lt;T&gt;的类型
  • NHibernate 3.2 中存在同样的问题(和解决方案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多