2013-05-24 1 views
1

Je crée manuellement une expression qui utilise IEnumerable.Where() pour filtrer une requête DataServiceQuery à partir d'un proxy côté client du service de données WCF.NotSupportedException: Impossible de convertir l'expression de constante 1 en chaîne

public class EntityIdentity 
{ 
    public EntityIdentity(long id); 
    { 
     this.Id = id; 
    } 

    private long Id {get; private set;} 

    public override bool Equals(object obj) 
    { 
     return obj is EntityIdentity && this.Id == (obj as EntityIdentity).Id; 
    } 

    public override string ToString() 
    { 
     return this.Id.ToString(); 
    } 
} 

public class Entity 
{ 
    public Entity() 
    { 
     this.Id = new EntityIdentity(0); 
     this.Name = null; 
    } 

    public EntityId Id { get; set; } 

    public string Name { get; set; } 
} 

Compte tenu des classes ci-dessus, je crée une expression qui est l'équivalent à ce qui suit où EntityIdentity targetId = new EntityIdentity(1).

container.Entities.Where(e => e.Id.Equals(targetId)); 

Lorsque je tente de résoudre cette requête, le traducteur LINQ-to-URI génère l'exception suivante:

{System.NotSupportedException: Could not convert constant 1 expression to string. 
    at System.Data.Services.Client.ExpressionWriter.VisitConstant(ConstantExpression c) 
    at System.Data.Services.Client.ALinqExpressionVisitor.Visit(Expression exp) 
    at System.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit(Expression exp) 
    at System.Data.Services.Client.ExpressionWriter.Visit(Expression exp) 
    at System.Data.Services.Client.ExpressionWriter.VisitOperand(Expression e, Nullable`1 parentType, Nullable`1 childDirection) 
    at System.Data.Services.Client.ExpressionWriter.VisitBinary(BinaryExpression b) 
    at System.Data.Services.Client.ALinqExpressionVisitor.Visit(Expression exp) 
    at System.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit(Expression exp) 
    at System.Data.Services.Client.ExpressionWriter.Visit(Expression exp) 
    at System.Data.Services.Client.ExpressionWriter.VisitOperand(Expression e, Nullable`1 parentType, Nullable`1 childDirection) 
    at System.Data.Services.Client.ExpressionWriter.VisitBinary(BinaryExpression b) 
    at System.Data.Services.Client.ALinqExpressionVisitor.Visit(Expression exp) 
    at System.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit(Expression exp) 
    at System.Data.Services.Client.ExpressionWriter.Visit(Expression exp) 
    at System.Data.Services.Client.ExpressionWriter.Translate(Expression e) 
    at System.Data.Services.Client.ExpressionWriter.ExpressionToString(DataServiceContext context, Expression e, Boolean inPath, Version& uriVersion) 
    at System.Data.Services.Client.UriWriter.ExpressionToString(Expression expression, Boolean inPath) 
    at System.Data.Services.Client.UriWriter.VisitQueryOptionExpression(FilterQueryOptionExpression fqoe) 
    at System.Data.Services.Client.UriWriter.VisitQueryOptions(ResourceExpression re) 
    at System.Data.Services.Client.UriWriter.VisitResourceSetExpression(ResourceSetExpression rse) 
    at System.Data.Services.Client.DataServiceALinqExpressionVisitor.Visit(Expression exp) 
    at System.Data.Services.Client.UriWriter.Translate(DataServiceContext context, Boolean addTrailingParens, Expression e, Uri& uri, Version& version) 
    at System.Data.Services.Client.DataServiceQueryProvider.Translate(Expression e) 
    at System.Data.Services.Client.DataServiceQuery`1.Translate() 
    at System.Data.Services.Client.DataServiceQuery`1.QueryComponents(ClientEdmModel model) 
    at System.Data.Services.Client.DataServiceRequest.CreateExecuteResult(Object source, DataServiceContext context, AsyncCallback callback, Object state, String method) 
    at System.Data.Services.Client.DataServiceRequest.BeginExecute(Object source, DataServiceContext context, AsyncCallback callback, Object state, String method) 
    at System.Data.Services.Client.DataServiceQuery`1.BeginExecute(AsyncCallback callback, Object state) 
    at System.Data.Services.Client.DataServiceQuery`1.BeginExecuteInternal(AsyncCallback callback, Object state) 
    at System.Data.Services.Client.DataServiceQuery.BeginExecute(AsyncCallback callback, Object state) 
    at ProAlign.ServerDataModule.Services.ModelSetQueryContext.<>c__DisplayClassa.<Execute>b__3() 
    at System.Threading.Tasks.Task`1.InnerInvoke() 
    at System.Threading.Tasks.Task.Execute()} 

ladite "1 constante expression" fait référence à la valeur de la variable targetId. Qu'est-ce que cela signifie et que dois-je faire à ce sujet?

+0

'Je crée une expression qui est l'équivalent de la where.' suivante Pourriez-vous ajouter ce code? – nmat

Répondre

2

Edit:

Le vrai problème peut être qu'ils requête est manipulation pas la classe EntityIdentity car il ne peut être en mesure de traiter les primitives. Peut-être essaie-t-il de convertir la classe en une chaîne de caractères. Je suggérerais alors de ne travailler qu'avec des primitives dans la requête.

En EntityIdentity la propriété Id au public:

public long Id {get; private set;} 

Et puis l'expression de requête devient ceci:

var result = Container.Entities.Where (e => e.Id.Id.Equals(1));  
+0

Remarque sur l'OP: EF ne pourra pas non plus traduire EntityIdentity. – usr

+0

d'après son code 'targetID' est un' EntityIdentity' – nmat

+0

@nmat, je l'ai vu, mais je n'y ai pas cru au début car il y a quelques erreurs dans son code (un point-virgule après le ctor et la mauvaise classe nom pour EntityIdentity dans Entity). Mais, après réflexion, je pense que le problème est que la requête échoue parce qu'elle ne peut pas gérer une primitive. J'ai mis à jour mon explication. –

Questions connexes