获取 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, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary2 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 查询表达式) +133
NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression表达式,IQuery&query,NhLinqExpression&nhQuery)+119
NHibernate.Linq.DefaultQueryProvider.Execute(表情表情)+38
NHibernate.Linq.DefaultQueryProvider.Execute(表情表情)+15
Continental.INDiuM.WebUi.Models.Select2PagedResult..ctor(IQueryable`1 list, 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(闭包, ControllerBase, 对象[]) +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
以找到罪魁祸首。
我有以下 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, IDictionary
2 enabledFilters) +396
NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, 浅布尔) +149
NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression 查询表达式) +133
NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression表达式,IQuery&query,NhLinqExpression&nhQuery)+119
NHibernate.Linq.DefaultQueryProvider.Execute(表情表情)+38
NHibernate.Linq.DefaultQueryProvider.Execute(表情表情)+15
Continental.INDiuM.WebUi.Models.Select2PagedResult..ctor(IQueryable`1 list, 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(闭包, ControllerBase, 对象[]) +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
以找到罪魁祸首。