2010-08-27 6 views
0

Salutations,grille Telerik MVC - ArgugumentException lors du filtrage

Je vais avoir le problème affiché here (le poste du 18 Août est le mien), mais ne va nulle part. En un mot, le filtrage avec la grille MVC de Telerik provoque une exception ArgumentException avec le message "L'argument de DbIsNullExpression doit faire référence à un type primitif ou de référence." Fait intéressant, si vous .ToList() le IQueryable d'abord, vous évitez le problème (mais en retirant toutes ces données n'est pas une bonne solution). En utilisant également Entity Framework et Ajax, je ne sais pas si c'est un problème ou non. Voici la trace de la pile:

System.ArgumentException was unhandled by user code 
    Message=The argument to DbIsNullExpression must refer to a primitive or reference type. 
    Source=System.Data.Entity 
    StackTrace: 
     at System.Data.Common.CommandTrees.ExpressionBuilder.Internal.ArgumentValidation.ValidateIsNull(DbExpression argument, Boolean allowRowType) 
     at System.Data.Objects.ELinq.ExpressionConverter.EqualsTranslator.CreateIsNullExpression(ExpressionConverter parent, Expression input) 
     at System.Data.Objects.ELinq.ExpressionConverter.EqualsTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.NotTranslator.TypedTranslate(ExpressionConverter parent, UnaryExpression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.NotEqualsTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.ConditionalTranslator.TypedTranslate(ExpressionConverter parent, ConditionalExpression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.BinaryTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TranslateIntoCanonicalFunction(String functionName, Expression Expression, Expression[] linqArguments) 
     at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.CanonicalFunctionDefaultTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) 
     at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.EqualsTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input) 
     at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding) 
     at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda) 
     at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) 
     at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) 
     at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.AggregateTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) 
     at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) 
     at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
     at System.Data.Objects.ELinq.ExpressionConverter.Convert() 
     at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption) 
     at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) 
     at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator() 
     at System.Data.Objects.ObjectQuery`1.GetEnumeratorInternal() 
     at System.Data.Objects.ObjectQuery.System.Collections.IEnumerable.GetEnumerator() 
     at System.Linq.Enumerable.d__b1`1.MoveNext() 
     at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source) 
     at System.Data.Objects.ELinq.ObjectQueryProvider.b__3[TResult](IEnumerable`1 sequence) 
     at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot) 
     at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute(Expression expression) 
     at Telerik.Web.Mvc.Extensions.QueryableExtensions.Count(IQueryable source) in C:\Projects\SoftExposure\Telerik.Web.Mvc\Extensions\QueryableExtensions.cs:line 399 
     at Telerik.Web.Mvc.Extensions.QueryableExtensions.ToGridModel(IQueryable queryable, Int32 page, Int32 pageSize, IList`1 sortDescriptors, IEnumerable`1 filterDescriptors, IEnumerable`1 groupDescriptors) in C:\Projects\SoftExposure\Telerik.Web.Mvc\Extensions\QueryableExtensions.cs:line 45 
     at Telerik.Web.Mvc.UI.GridDataProcessor.EnsureDataSourceIsProcessed() in C:\Projects\SoftExposure\Telerik.Web.Mvc\UI\Grid\GridDataProcessor.cs:line 162 
     at Telerik.Web.Mvc.UI.GridDataProcessor.get_ProcessedDataSource() in C:\Projects\SoftExposure\Telerik.Web.Mvc\UI\Grid\GridDataProcessor.cs:line 132 
     at Telerik.Web.Mvc.GridActionAttribute.OnActionExecuted(ActionExecutedContext filterContext) in C:\Projects\SoftExposure\Telerik.Web.Mvc\UI\Grid\GridActionAttribute.cs:line 104 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 
     at System.Web.Mvc.ControllerActionInvoker.c__DisplayClassd.c__DisplayClassf.b__c() 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 
    InnerException: 

et est ici le code qui provoque

 // Note: We need to use a ViewModel rather than the entity directly because the entity relationships 
     // will cause a circular reference when used via Ajax. 
     // See http://www.telerik.com/help/aspnet-mvc/telerik-ui-components-grid-troubleshooting.html#ServerError 
     // 
     private IEnumerable GetCustomers() 
     { 
      var model = new NorthwindEntities().Customers 
       .Select(c => new CustomerModel() 
       { 
        CustomerID = c.CustomerID, 
        CompanyName = c.CompanyName, 
        ContactName = c.ContactName 
       }); // Call .ToList() here to avoid "The argument to DbIsNullExpression must refer to a primitive or reference type." 
        // when filtering. 
        // See http://www.telerik.com/community/forums/aspnet-mvc/grid/the-argument-to-dbisnullexpression-must-refer-to-a-primitive-or-reference-type.aspx 

      return model; 
     } 

pas à pas à travers la source, il est facile de voir que cela se passe dans la méthode QueryableExtensions.Count(), mais le vrai raison est à cause de ce qui se passe dans la méthode .Where() quand on a filterDescriptors. Quelle que soit l'expression que les choses construisent semble être la cause.

C'est la première fois que j'ai regardé si profondément dans les arbres d'expression et que non, si quelqu'un peut suggérer quelque chose à essayer, c'est apprécié.

Cordialement, Mike

Répondre

0

Regarder par-dessus le fil, il semble que Telerik n'a pas été en mesure de reproduire le problème sur leur fin, ils n'étaient pas en mesure d'obtenir un exemple de projet affichant la question. Avez-vous essayé d'emballer cela et de l'envoyer via leur système de ticketing de support (différent de leurs forums en ligne). Je suis sûr qu'ils aimeraient obtenir quelque chose reproduisant le problème et vous devriez être en mesure d'obtenir une résolution de leur équipe de soutien :)

+0

Merci, je ne savais pas qu'ils avaient un système de billetterie différent de leurs forums. Nous les avons contactés et nous verrons comment ça se passe. –

0

Telerik a eu la gentillesse d'ouvrir un ticket de support (j'utilise le gratuit, version open source). Il s'avère que le problème est résolu dans la dernière goutte - 2010.2.825.

Questions connexes