RavenDB-防止查询错误时出现异常

RavenDB-防止查询错误时出现异常,ravendb,Ravendb,我试图在一个应用程序中实现一些定制的搜索,允许用户输入特定的字段和术语,并查询结果;例如,有一个文本框,他们可以键入名称:Stacey并运行一些代码 如果他们给它起了一个有效的名字,那就行了。但是,如果他们提供了它找不到的信息,我会得到一个异常,我不知道如何阻止它。一个尝试似乎也不起作用;代码不太复杂,但有点零碎 基本上,这是在从控制器方法接收到零或两个字符串之后运行的。第一个字符串是字段,第二个字符串是要查询的值。如果我给它有效的输入,它工作得很好;但任何其他因素都会导致程序崩溃。我能做些什么

我试图在一个应用程序中实现一些定制的搜索,允许用户输入特定的字段和术语,并查询结果;例如,有一个文本框,他们可以键入<代码>名称: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