【问题标题】:Getting a NotSupportedException: Specified method is not supported. NHibernate C#获取 NotSupportedException:不支持指定的方法。 NHibernate C#
【发布时间】:2018-07-12 11:14:08
【问题描述】:

我有以下 LINQ 查询:

var coverageQuery = _repository.LogicalEcus
    .Where(ecu => ecu.Alias != null)
    .Select(ecu => ecu.Alias)
    .Where(ecuAlias => searchTerm == "" || ecuAlias.Mnemonic.Contains(searchTerm.ToUpper()))
    .OrderBy(ecuAlias => ecuAlias.Mnemonic)
    .Select(x => x.Mnemonic)
    .Distinct()
    .Select(mnemonic => new Select2Result(mnemonic));

查询已成功执行,但将结果传递给 Select2PagedResult 构造函数时:

var result = new Select2PagedResult(coverageQuery, pageNum, pageSize);

它将失败并出现以下错误:

[NotSupportedException:不支持指定的方法。] NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.GetClassName(IASTNode querySource) +117 NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.Process(IASTNode 树)+188 NHibernate.Hql.Ast.ANTLR.AstPolymorphicProcessor.Process() +51 NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary2 filters, ISessionFactoryImplementor factory) +154 NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary2 enabledFilters) +396 NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow) +149 NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression) +133 NHibernate.Linq.DefaultQueryProvider.PrepareQuery(表达式表达式,IQuery& 查询,NhLinqExpression& nhQuery)+119 NHibernate.Linq.DefaultQueryProvider.Execute(表达式表达式)+38 NHibernate.Linq.DefaultQueryProvider.Execute(表达式表达式)+15 C:\Projects\INDiuM\WebUi\Models\Select2PagedResult.cs:11 中的 Continental.INDiuM.WebUi.Models.Select2PagedResult..ctor(IQueryable`1 list, Int32 pageNumber, Int32 itemsPerPage) C:\Projects\INDiuM\WebUi\Controllers\CoverageManagementController.cs:124 中的 Continental.INDiuM.WebUi.Controllers.CoverageManagementController.GetCoverageAliases(String id, String searchTerm, Int32 pageSize, Int32 pageNum) lambda_method(Closure , ControllerBase , Object[] ) +301

Select2PagedResult 的构造函数如下所示:

public Select2PagedResult(IQueryable<Select2Result> list, int pageNumber, int itemsPerPage)
{
    Total = list.Count();
    Results = list
        .Skip((pageNumber - 1) * itemsPerPage)
        .Take(itemsPerPage)
        .ToList();
}

在 Select2PagedResult 的构造函数中,它会在这一行完全失败:

从上面的 LINQ 查询中删除 .Distinct() 可以解决问题,不会再次抛出异常。

另外,如果我将 Select2PagedResult 的构造函数更改为接受 List 而不是 IQueryable 也可以:

public Select2PagedResult(List<Select2Result> list, int pageNumber, int itemsPerPage)

我也尝试重新排列 LINQ 查询顺序,但没有成功。

就像 .Count() 在 NhQueryable 上不存在。

我没有找到对此的解释,我真的不明白这是什么问题,特别是因为它在几个月前就可以工作......

任何建议都将不胜感激。

【问题讨论】:

  • 似乎 NhQueryable 不提供 Count() - 只是为了检查:您是否尝试过先转换为列表?例如。总计 = list.ToList().Count;
  • 是的,也试过了,不幸的是,NhQueryable 似乎也没有 .ToList()。
  • 这很奇怪,因为几个月前它还在工作。我不知道项目中可以更改哪些内容,从而导致此失败。也很奇怪,因为从 LINQ 中删除 .Distinct(),它不会再失败了..
  • 它在Count() 失败,因为那是查询被“物化”和执行的地方。 LINQ 查询中有一些东西 NH 无法转换为 SQL 查询。
  • Distinct() 方法如何知道哪些助记符是唯一的?

标签: c# linq nhibernate jquery-select2


【解决方案1】:

如果您在查询的每个阶段都添加AsEnumerable(),然后重试,您可以缩小关注点:

var coverageQuery = 
    _repository.LogicalEcus
        .Where(ecu => ecu.Alias != null)
        .Select(ecu => ecu.Alias)
        .Where(ecuAlias => searchTerm == "" || ecuAlias.Mnemonic.Contains(searchTerm.ToUpper()))
        .OrderBy(ecuAlias => ecuAlias.Mnemonic)
        .Select(x => x.Mnemonic)

        // Materialises and runs query. Rest is processed against objects.
        // Any method that runs after this line but not before can be
        // transformed into SQL equivalent
        .AsEnumerable()    

        .Distinct()
        .Select(mnemonic => new Select2Result(mnemonic));

您可以在列表中上下移动对AsEnumerable的呼叫以找到罪魁祸首。

【讨论】:

    猜你喜欢
    • 2016-12-25
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多