RavenDB-防止查询错误时出现异常
我试图在一个应用程序中实现一些定制的搜索,允许用户输入特定的字段和术语,并查询结果;例如,有一个文本框,他们可以键入<代码>名称:Stacey并运行一些代码 如果他们给它起了一个有效的名字,那就行了。但是,如果他们提供了它找不到的信息,我会得到一个异常,我不知道如何阻止它。一个RavenDB-防止查询错误时出现异常,ravendb,Ravendb,我试图在一个应用程序中实现一些定制的搜索,允许用户输入特定的字段和术语,并查询结果;例如,有一个文本框,他们可以键入名称:Stacey并运行一些代码 如果他们给它起了一个有效的名字,那就行了。但是,如果他们提供了它找不到的信息,我会得到一个异常,我不知道如何阻止它。一个尝试似乎也不起作用;代码不太复杂,但有点零碎 基本上,这是在从控制器方法接收到零或两个字符串之后运行的。第一个字符串是字段,第二个字符串是要查询的值。如果我给它有效的输入,它工作得很好;但任何其他因素都会导致程序崩溃。我能做些什么
尝试似乎也不起作用;代码不太复杂,但有点零碎
基本上,这是在从控制器方法接收到零或两个字符串之后运行的。第一个字符串是字段,第二个字符串是要查询的值。如果我给它有效的输入,它工作得很好;但任何其他因素都会导致程序崩溃。我能做些什么吗
冗长的回调过程是因为每个控制器方法需要对结果做出不同的反应,但这与此问题无关
private JsonResult JsonDataFromDataSourceRequest<T, TIndexCreator>
([DataSourceRequest] DataSourceRequest request,
Func<IDocumentQuery<T>, string, string, IDocumentQuery<T>> search,
Func<IDocumentQuery<T>, IDocumentQuery<T>> sort)
where T : IHasName
where TIndexCreator : Raven.Client.Indexes.AbstractIndexCreationTask, new() {
RavenQueryStatistics statistics;
var query = RavenSession
.Advanced.DocumentQuery<T, TIndexCreator>()
.WhereEquals("collection", typeof(T).RavenCollection())
.WaitForNonStaleResultsAsOfNow()
.Statistics(out statistics); // output our query statistics
// we can accept a sorting system, or additional query options here
if (sort != null)
query = sort(query);
if (request.Filters != null) {
if (request.Filters.Any()) {
var filters = request.Filters.ToFilters();
// determine the field/term to search by
var name = filters.Count > 0 ? filters[0].Value.ToString() : null;
var field = filters.Count > 0 ? filters[0].Member.ToString() : "Name";
if (name != null && !String.IsNullOrEmpty(name)) {
query = query.AndAlso().Search(field, name);
}
}
}
var results = query
.OrderBy(n => n.Name)
.Skip((request.Page - 1) * request.PageSize)
.Take(request.PageSize)
.ToList();
var totalResults = statistics.TotalResults;
return Json(new { data = results, total = totalResults });
}
异常消息
这是一条完整的异常消息
Url: "/databases/dev-isolated/indexes/Raven/DocumentsByEntity?&query=collection%3Ausers%20AND%20Number%3A%28%203%29&pageSize=5&sort=Name&SortHint-collection=String&SortHint-Name=String&cutOff=2015-10-02T15%3A12%3A31.5784892Z&waitForNonStaleResultsAsOfNow=true"
System.ArgumentException: The field 'DisplayName' is not indexed, cannot query on fields that are not indexed
at Raven.Database.Indexing.Index.AssertQueryDoesNotContainFieldsThatAreNotIndexed(IndexQuery indexQuery, AbstractViewGenerator viewGenerator) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Indexing\Index.cs:line 1130
at Raven.Database.Indexing.Index.IndexQueryOperation.<Query>d__5a.MoveNext() in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Indexing\Index.cs:line 1252
at Raven.Database.Util.ActiveEnumerable`1..ctor(IEnumerable`1 enumerable) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Util\ActiveEnumerable.cs:line 16
at Raven.Database.Actions.QueryActions.DatabaseQueryOperation.Init() in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Actions\QueryActions.cs:line 245
at Raven.Database.Actions.QueryActions.<>c__DisplayClasse.<Query>b__a(IStorageActionsAccessor accessor) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Actions\QueryActions.cs:line 118
at Raven.Storage.Esent.TransactionalStorage.ExecuteBatch(Action`1 action, EsentTransactionContext transactionContext) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Storage\Esent\TransactionalStorage.cs:line 843
at Raven.Storage.Esent.TransactionalStorage.Batch(Action`1 action) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Storage\Esent\TransactionalStorage.cs:line 807
at Raven.Database.Actions.QueryActions.Query(String index, IndexQuery query, CancellationToken externalCancellationToken) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Actions\QueryActions.cs:line 108
at Raven.Database.Server.Controllers.IndexController.PerformQueryAgainstExistingIndex(String index, IndexQuery indexQuery, Etag& indexEtag, HttpResponseMessage msg, CancellationToken token) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers\IndexController.cs:line 625
at Raven.Database.Server.Controllers.IndexController.ExecuteQuery(String index, Etag& indexEtag, HttpResponseMessage msg, CancellationToken token) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers\IndexController.cs:line 570
at Raven.Database.Server.Controllers.IndexController.GetIndexQueryResult(String index, CancellationToken token) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers\IndexController.cs:line 541
at Raven.Database.Server.Controllers.IndexController.IndexGet(String id) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers\IndexController.cs:line 182
at lambda_method(Closure , Object , Object[] )
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()
Url:“/databases/dev-isolated/index/Raven/DocumentsByEntity?&query=collection%3Ausers%20和%20Number%3A%28%203%29&pageSize=5&sort=Name&SortHint-collection=String&SortHint-Name=String&cutOff=2015-10-02T15%3A12%3A31.5784892Z&waitfornonstaleresultsafow=true”
System.ArgumentException:字段“DisplayName”未编制索引,无法查询未编制索引的字段
在c:\Builds\RavenDB-Stable-3.0\Raven.Database\Indexing\Index.cs中的Raven.Database.Indexing.Index.AssertQueryDoesnotContainedFieldSthatNotIndexed(IndexQuery IndexQuery,AbstractViewGenerator viewGenerator viewGenerator)中
在c:\Builds\RavenDB-Stable-3.0\Raven.Database\Index.Index.IndexQueryOperation.d_u5A.MoveNext()中
在c:\Builds\RavenDB-Stable-3.0\Raven.Database\Util\ActiveEnumerable`1..ctor(IEnumerable`1 enumerable)中的Raven.Database.Util.ActiveEnumerable`1..ctor处:第16行
在c:\Builds\RavenDB-Stable-3.0\Raven.Database\Actions\QueryActions.cs中的Raven.Database.Actions.QueryActions.DatabaseQueryOperation.Init()处:第245行
在c:\Builds\RavenDB-Stable-3.0\Raven.Database\Actions.QueryActions.c_uu中显示classe.b_uua(iStorageActionsAccess访问器):第118行
在c:\Builds\RavenDB-Stable-3.0\Raven.Database\Storage\Esent\TransactionalStorage.cs中的Raven.Storage.Esent.TransactionalStorage.ExecuteBatch(Action`1 Action,EsentTransactionContext transactionContext)处:第843行
在c:\Builds\RavenDB-Stable-3.0\Raven.Database\Storage\Esent\TransactionalStorage.cs中的Raven.Storage.Esent.TransactionalStorage.Batch(Action`1 Action)处:第807行
在c:\Builds\RavenDB-Stable-3.0\Raven.Database\Actions\QueryActions.Query中的Raven.Database.Actions.QueryActions.Query(字符串索引、索引查询、取消令牌外部取消令牌):第108行
在c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\controller.performqueryagainsteexistingindex(字符串索引、索引查询、Etag&indexEtag、HttpResponseMessage消息、CancellationToken标记)中的Raven.Database
在c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers.IndexController.ExecuteQuery中的Raven.Database.Server.Controllers.ExecuteQuery(字符串索引、Etag&indexEtag、HttpResponseMessage消息、CancellationToken令牌)中:第570行
在c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers.IndexController.GetIndexQueryResult(字符串索引,取消令牌)中
在c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers.IndexController.IndexGet中的Raven.Database.Server.Controllers.IndexController.IndexGet(字符串id):第182行
在lambda_方法(闭包、对象、对象[])
在System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.c\u DisplayClass10.b\u 9(对象实例,对象[]方法参数)
位于System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext,IDictionary`2参数,CancellationToken CancellationToken)
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Web.Http.Controllers.ApiControllerActionInvoker.d_u0.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Web.Http.Controllers.ActionFilterResult.d_u2.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Web.Http.Controllers.ExceptionFilterResult.d_u0.MoveNext()中
修理
我做了适当的修改,这是方法的最终结果
private JsonResult JsonDataFromDataSourceRequest<T, TIndexCreator>
([DataSourceRequest] DataSourceRequest request,
Func<IDocumentQuery<T>, string, string, IDocumentQuery<T>> search,
Func<IDocumentQuery<T>, IDocumentQuery<T>> sort)
where T : IHasName
where TIndexCreator : Raven.Client.Indexes.AbstractIndexCreationTask, new() {
try {
// we need to be able to catch some query statistics to make sure that the
// grid view is complete and accurate, with paging
RavenQueryStatistics statistics;
// try to query the items listing as quickly as we can, getting only the
// page we want out of it
var query = RavenSession
.Advanced.DocumentQuery<T, TIndexCreator>()
.WhereEquals("collection", typeof(T).RavenCollection())
.WaitForNonStaleResultsAsOfNow()
.Statistics(out statistics); // output our query statistics
// we can accept a sorting system, or additional query options here
if (sort != null)
query = sort(query);
// deserialize the contents of the kendo grid filter
if (request.Filters != null) {
if (request.Filters.Any()) {
var filters = request.Filters.ToFilters();
var name = filters.Count > 0 ? filters[0].Value.ToString() : null;
var field = filters.Count > 0 ? filters[0].Member.ToString() : "Name";
if (name != null && !String.IsNullOrEmpty(name)) {
query = search(query, field, name);
}
}
}
// finish constructing the items query
var results = query
.OrderBy(n => n.Name)
.Skip((request.Page - 1) * request.PageSize)
.Take(request.PageSize)
.ToList();
var totalResults = statistics.TotalResults;
return Json(new { data = results, total = totalResults, errors = "" });
}
catch {
// the user tried to ask for something
// that doesn't exist, or a field that
// cannot be queried
var results = new List<T>();
// total results is always 0 on an error
var totalResults = 0;
var errors = new List<string> {
"You have attempted to query an invalid field, or given an inappropriate value."
};
return Json(new { data = results, total = totalResults, errors = errors });
}
}
private JsonResult JsonDataFromDataSourceRequest
([DataSourceRequest]DataSourceRequest请求,
Func搜索,
Func排序)
其中T:IHasName
其中TIndexCreator:Raven.Client.Indexes.AbstractIndexCreationTask,new(){
试一试{
//我们需要能够捕获一些查询统计信息,以确保
//网格视图完整准确,具有分页功能
拉文奎尔统计;
//尽可能快地查询项目列表,只获取
//佩奇,我们想从中解脱出来
var query=RavenSession
.Advanced.DocumentQuery()
其中等于(“集合”,类型为(T)。
private JsonResult JsonDataFromDataSourceRequest<T, TIndexCreator>
([DataSourceRequest] DataSourceRequest request,
Func<IDocumentQuery<T>, string, string, IDocumentQuery<T>> search,
Func<IDocumentQuery<T>, IDocumentQuery<T>> sort)
where T : IHasName
where TIndexCreator : Raven.Client.Indexes.AbstractIndexCreationTask, new() {
try {
// we need to be able to catch some query statistics to make sure that the
// grid view is complete and accurate, with paging
RavenQueryStatistics statistics;
// try to query the items listing as quickly as we can, getting only the
// page we want out of it
var query = RavenSession
.Advanced.DocumentQuery<T, TIndexCreator>()
.WhereEquals("collection", typeof(T).RavenCollection())
.WaitForNonStaleResultsAsOfNow()
.Statistics(out statistics); // output our query statistics
// we can accept a sorting system, or additional query options here
if (sort != null)
query = sort(query);
// deserialize the contents of the kendo grid filter
if (request.Filters != null) {
if (request.Filters.Any()) {
var filters = request.Filters.ToFilters();
var name = filters.Count > 0 ? filters[0].Value.ToString() : null;
var field = filters.Count > 0 ? filters[0].Member.ToString() : "Name";
if (name != null && !String.IsNullOrEmpty(name)) {
query = search(query, field, name);
}
}
}
// finish constructing the items query
var results = query
.OrderBy(n => n.Name)
.Skip((request.Page - 1) * request.PageSize)
.Take(request.PageSize)
.ToList();
var totalResults = statistics.TotalResults;
return Json(new { data = results, total = totalResults, errors = "" });
}
catch {
// the user tried to ask for something
// that doesn't exist, or a field that
// cannot be queried
var results = new List<T>();
// total results is always 0 on an error
var totalResults = 0;
var errors = new List<string> {
"You have attempted to query an invalid field, or given an inappropriate value."
};
return Json(new { data = results, total = totalResults, errors = errors });
}
}
The field 'DisplayName' is not indexed, cannot query on fields that are not indexed