繁体   English   中英

获取NotSupportedException:不支持指定的方法。 NHibernate C#

[英]Getting a NotSupportedException: Specified method is not supported. NHibernate C#

我有以下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,字符串queryIdentifier,字符串collectionRole,布尔值浅,IDictionary 2 filters, ISessionFactoryImplementor factory) +154 NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary 2 enabledFilters)+396 NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression,布尔浅)+149 NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)+133 NHibernate.Providerin (表达式,IQuery&查询,NhLinqExpression&nhQuery)+119 NHibernate.Linq.DefaultQu eryProvider.Execute(表达式表达式)+38 NHibernate.Linq.DefaultQueryProvider.Execute(表达式表达式)+15 Continental.INDiuM.WebUi.Models.Select2PagedResult..ctor(IQueryable`1列表,Int32 pageNumber,Int32 itemsPerPage)在C:\\ Projects \\ INDiuM \\ WebUi \\ Models \\ Select2PagedResult.cs:11 Continental.INDiuM.WebUi.Controllers.CoverageManagementController.GetCoverageAliases(String id,String searchTerm,Int32 pageSize,Int32 pageNum)在C:\\ Projects \\ INDiuM \\ WebUi \\ Controllers \\ CoverageManagementController .cs:124 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上不存在。

我没有找到对此的解释,我真的不明白这是什么问题,尤其是因为它在几个月前就开始工作了……

任何建议,将不胜感激。

如果将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的呼叫以找到罪魁祸首。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM