获取NotSupportedException:不支持指定的方法。NHibernate C#
我有以下LINQ查询:获取NotSupportedException:不支持指定的方法。NHibernate C#,c#,linq,nhibernate,jquery-select2,C#,Linq,Nhibernate,Jquery Select2,我有以下LINQ查询: var coverageQuery = _repository.LogicalEcus .Where(ecu => ecu.Alias != null) .Select(ecu => ecu.Alias) .Where(ecuAlias => searchTerm == "" || ecuAlias.Mnemonic.Contains(searchTerm.ToUpper())) .OrderBy(ecuAlias =&g
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(IASTNodeQuerySource)+117
NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.Process(IASTNode树)+188
NHibernate.Hql.Ast.ANTLR.astpromphicprocessor.Process()+51
NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode Ast、字符串查询标识符、字符串集合角色、布尔值浅型、IDictionary2过滤器、ISessionFactoryImplementor工厂)+154
NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression,布尔浅层,IDictionary
2个EnabledFilter)+396
NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression,布尔浅层)+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
Continental.INDiuM.WebUi.Models.Select2PagedResult..ctor(IQueryable`1列表,Int32页码,Int32项目页面)位于C:\Projects\INDiuM\WebUi\Models\Select2PagedResult.cs:11中
C:\Projects\INDiuM\WebUi\Controllers\CoverageManagementController.getCoverageAlias(字符串id、字符串搜索词、Int32 pageSize、Int32 pageNum)中的Continental.INDiuM.WebUi.Controllers.CoverageManagementController.getCoverageAlias(字符串id、字符串搜索词、Int32 pageSize、Int32 pageNum)
lambda_方法(闭包、控制器库、对象[])+301
Select2PagedResult的构造函数如下所示:
public Select2PagedResult(IQueryable<Select2Result> list, int pageNumber, int itemsPerPage)
{
Total = list.Count();
Results = list
.Skip((pageNumber - 1) * itemsPerPage)
.Take(itemsPerPage)
.ToList();
}
public Select2PagedResult(IQueryable列表、int pageNumber、int itemsPerPage)
{
总数=list.Count();
结果=列表
.Skip((页码-1)*itemsPerPage)
.Take(itemsPerPage)
.ToList();
}
它将在Select2PagedResult的构造函数中的这一行失败:
var result = new Select2PagedResult(coverageQuery, pageNum, pageSize);
从上面的LINQ查询中删除.Distinct()可以解决问题,不会再次引发异常
此外,如果我将Select2PagedResult的构造函数更改为接受列表而不是IQueryable,也可以:
public Select2PagedResult(List<Select2Result> list, int pageNumber, int itemsPerPage)
public Select2PagedResult(列表列表、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
的调用以查找罪魁祸首。NhQueryable似乎不提供Count()-仅用于检查:您是否已尝试先转换为列表?例如,Total=list.ToList().Count;是的,我也试过了,但很不幸的是,NhQueryable似乎也没有.ToList()。这很奇怪,因为几个月前它还在工作。我不知道项目中会发生什么变化,从而导致失败。奇怪的是,从LINQ中删除.Distinct(),它就不会再失败了。.它在Count()
中失败了,因为这就是查询被“具体化”和执行的地方。LINQ查询中有NH无法转换为SQL查询的内容。Distinct()
方法如何知道哪些助记符是唯一的?