2010-08-27 59 views
0

问候,我遇到的问题发布here(日期为8月18日的文章是我的)Telerik的MVC网 - ArgugumentException过滤

的时候,而不是在任何地方获得。

简而言之,使用Telerik的MVC网格进行过滤会导致带有消息“ArgumentException”,该参数指向DbIsNullExpression必须引用原语或引用类型。有趣的是,如果你首先使用IQueryable .ToList(),你可以避免这个问题(但是撤回所有这些数据并不是一个好的解决方案)。也使用实体框架和Ajax,不知道这是否是一个问题。这里的堆栈跟踪:

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: 

,这里是导致它

 // 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; 
     } 

通过源步进代码,可以很容易地看到它在QueryableExtensions.Count发生()方法,但真正原因是因为当有人使用filterDescriptors时.Where()方法发生了什么。无论建筑材料的表现是什么似乎都是原因。

这是我第一次深入研究表达式树,还有什么不是,如果有人可以建议尝试一些东西,很感激。

的问候, 迈克

回答

0

纵观它好像是Telerik的不能够重现他们的最终问题,也不是他们能够得到显示问题的样本项目中的线程。您是否尝试打包并通过支持售票系统将其发送给他们(与他们的在线论坛不同)。我相信他们会很高兴得到一个重现问题的东西,你应该能够从他们的支持团队得到一个解决方案:)

+0

谢谢,我不知道他们有一个与他们的论坛不同的票务系统。有没有联系他们,我们会看看它是如何发展的。 – 2010-09-13 19:00:09

0

Telerik很友善地打开支持票(我使用免费,开源版本)。原来这个问题在最近的一次下降 - 2010.2.825中得到了解决。