2010-01-20 2 views
2

J'ai travaillé avec une requête Linq dans une application Silverlight qui retourne uniquement la ligne d'une table qui contient la valeur maximale du champ OptionARMRunId (identité). Lorsqu'elle est exécutée dans LinqPad, la requête s'exécute correctement et renvoie la ligne correcte. Cependant, lorsqu'il est utilisé dans mon application Silverlight, l'application ne dépasse jamais l'écran de chargement (alors que le pourcentage d'état passe à 100%, le cercle bleu continue à tourner autour de la nauseam) et je reçois une erreur dans le navigateur. J'ai inclus l'instruction Linq d'origine, la déclaration telle qu'elle apparaît dans ma requête, et l'erreur ie ci-dessous.L'expression LINQ fonctionne dans LinqPad mais pas C# Silverlight Application

déclaration LINQ (fonctionne correctement):

from OptionARMProjection in OptionARMProjections.Where(row => row.OptionARMRunId == OptionARMProjections.Max(r => r.OptionARMRunId)) 
select OptionARMProjection 

déclaration LINQ dans la classe C# (provoque une erreur lorsque l'application silverlight est exécutée):

crocodileEntities proxy = new crocodileEntities(new Uri("CrocodileDbDataService.svc", UriKind.Relative)); 



    var ProjectionsQuery = from OptionARMProjections in proxy.OptionARMProjections.Where(row => row.OptionARMRunId == proxy.OptionARMProjections.Max(r => r.OptionARMRunId)) 
          select OptionARMProjections; 

erreur reçu dans IE8:

Plus d'information sur les événements de la page Web

User Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4,0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; Zune 4.0; OfficeLiveConnector.1.4; OfficeLivePatch.1.3; .NET4.0C; .NET4.0E) Horodatage: Mer, 20 janvier 2010 03:06:13 UTC

Message: Unhandled erreur dans Silverlight 2 Application La méthode 'Max' est pas pris en charge. à System.Data.Services.Client.ResourceBinder.VisitMethodCall (MethodCallExpression mce) à System.Data.Services.Client.ExpressionVisitor.Visit (Expression exp) à System.Data.Services.Client.DataServiceExpressionVisitor.Visit (expression exp) à System.Data.Services.Client.ExpressionVisitor.VisitBinary (BinaryExpression b) à System.Data.Services.Client.ResourceBinder.VisitBinary (BinaryExpression b) à System.Data.Services.Client. ExpressionVisitor.Visit (Expression exp) à System.Data.Services.Client.DataServiceExpressionVisitor.Visit (Expression exp) à System.Data.Services.Client.ExpressionVisitor.VisitLambda (LambdaExpression lambda) à System.Data.Services.Client.ExpressionVisitor.Visit (Expression exp) à System.Data.Services.Client.DataServiceExpressionVisitor.Visit (expression exp) à System.Data.Services.Client.ExpressionVisitor.VisitUnary (UnaryExpression u) à System.Data.Services.Client.ExpressionVisitor.Visit (expression exp) à System.Data.Services.Client. DataServiceExpressionVisitor.Visit (Expression exp) à System.Data.Services.Client.ExpressionVisitor.VisitExpressionList (ReadOnlyCollection 1 original) at System.Data.Services.Client.ExpressionVisitor.VisitMethodCall(MethodCallExpression m) at System.Data.Services.Client.ResourceBinder.VisitMethodCall(MethodCallExpression mce) at System.Data.Services.Client.ExpressionVisitor.Visit(Expression exp) at System.Data.Services.Client.DataServiceExpressionVisitor.Visit(Expression exp) at System.Data.Services.Client.ResourceBinder.AnalyzeProjection(MethodCallExpression mce, Boolean matchMembers, Expression& e) at System.Data.Services.Client.ResourceBinder.VisitMethodCall(MethodCallExpression mce) at System.Data.Services.Client.ExpressionVisitor.Visit(Expression exp) at System.Data.Services.Client.DataServiceExpressionVisitor.Visit(Expression exp) at System.Data.Services.Client.ResourceBinder.Bind(Expression e) at System.Data.Services.Client.DataServiceQueryProvider.Translate(Expression e) at System.Data.Services.Client.DataServiceQuery 1.get_QueryComponents() à System.Data.Services.Client.DataServiceRequest.CreateResult (Object source , le contexte DataServiceContext, rappel AsyncCallback, l'état de l'objet) à System.Data.Services.Client.DataServiceQuery`1.BeginExecute (AsyncCallback de rappel , objet état) à OptionARMChart.OptionARMUniverse.GetOptionArmProjectionsASync() à OptionARMChart.MainPage..ctor()
à OptionARMChart.App.Application_Startup (objet émetteur , StartupEventArgs e) à MS.Internal .CoreInvokeHandler.InvokeEventHandler (Int32 typeIndex, délégué handlerDelegate, expéditeur d'objets, objet args) à MS.Internal.JoltHelper.FireEvent (IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, String eventName) ligne: 1 Char: 1 Code: 0 URI: http://localhost:5004/optionarmcharttestpage.aspx

Répondre

3

.Max() ne sont pas pris en charge, une solution serait de faire un ordre inverse et prendre la première:

var ProjectionsQuery = proxy.OptionARMProjections 
         .Where(row => row.OptionARMRunId == proxy.OptionARMProjections 
         .OrderByDescending(r => r.OptionARMRunId)) 
         .Take(1); 

Correction: Seems it is supported in Silverlight 3+, mais il m'a donné le même problème plus une fois, alors peut-être que quelqu'un peut ajouter plus de détails sur pourquoi.

+0

merci beaucoup, je vais essayer! – Andrew

+0

Recevoir une erreur que l'opérateur '==' ne peut pas être appliqué aux opérandes de type 'int' et 'System.Linq.IOrderedQueryable Andrew

+0

mise à jour: got it avec: var ProjectionsQuery = proxy.OptionARMProjections.OrderByDescending (r => r.OptionARMRunId) .Take (1); merci encore pour l'aide – Andrew

1

La syntaxe URI utilisée par Data Services ne prend pas en charge toutes les fonctions prises en charge par LINQ to Objects ou LINQ to SQL. Je suppose que lorsque vous interrogez ceci dans LINQPad, vous faites une requête LINQ to SQL qui est la raison pour laquelle cela pourrait fonctionner là. Cependant, la complexité de votre requête n'est pas prise en charge par Data Services, ce qui explique votre exception d'exécution dans ce cas. À en juger par votre requête, vous devriez être capable d'utiliser la solution proposée par Nick, sauf que je pense qu'il y a une erreur dans la clause Where qu'il a fournie. En fait, à partir de votre échantillon d'origine, vous ne même pas besoin de la clause Where:

var = ProjectionsQuery proxy.OptionARMProjections .OrderByDescending (ligne => row.OptionARMRunId) .Take (1);

Questions connexes