我有以下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个启用过滤器)+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
在C:\ Projects \ INDiuM \ WebUi \ Models \ Select2PagedResult.cs:11中的Continental.INDiuM.WebUi.Models.Select2PagedResult..ctor(IQueryable`1列表,Int32 pageNumber,Int32 itemsPerPage)
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上不存在。
我没有找到对此的解释,我真的不明白这是什么问题,特别是因为它是在几个月前工作的...
任何建议都将不胜感激。
答案 0 :(得分: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
上以查找罪魁祸首。