C# NotSupportedException:无法将常量1表达式转换为字符串

C# NotSupportedException:无法将常量1表达式转换为字符串,c#,.net,linq,expression,wcf-data-services,C#,.net,Linq,Expression,Wcf Data Services,我正在手动构建一个表达式,该表达式使用IEnumerable.Where()从WCF数据服务客户端代理筛选DataServiceQuery public class EntityIdentity { public EntityIdentity(long id); { this.Id = id; } private long Id {get; private set;} public override bool Equals(object

我正在手动构建一个表达式,该表达式使用IEnumerable.Where()从WCF数据服务客户端代理筛选DataServiceQuery

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; }
}
给定上面的类,我正在创建一个表达式,该表达式等价于下面的表达式,其中
EntityIdentity targetId=new EntityIdentity(1)

当我尝试解析此查询时,LINQ到URI转换器引发以下异常:

{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()}
{System.NotSupportedException:无法将常量1表达式转换为字符串。
位于System.Data.Services.Client.ExpressionWriter.VisitConstant(ConstantExpression c)
在System.Data.Services.Client.ALinqExpressionVisitor.Visit(Expression-exp)中
在System.Data.Services.Client.DataServiceAliqExpressionVisitor.Visite(Expression exp)中
位于System.Data.Services.Client.ExpressionWriter.Visite(Expression exp)
位于System.Data.Services.Client.ExpressionWriter.VisitOperand(表达式e,可空`1 parentType,可空`1 childDirection)
位于System.Data.Services.Client.ExpressionWriter.VisitBinary(二进制表达式b)
在System.Data.Services.Client.ALinqExpressionVisitor.Visit(Expression-exp)中
在System.Data.Services.Client.DataServiceAliqExpressionVisitor.Visite(Expression exp)中
位于System.Data.Services.Client.ExpressionWriter.Visite(Expression exp)
位于System.Data.Services.Client.ExpressionWriter.VisitOperand(表达式e,可空`1 parentType,可空`1 childDirection)
位于System.Data.Services.Client.ExpressionWriter.VisitBinary(二进制表达式b)
在System.Data.Services.Client.ALinqExpressionVisitor.Visit(Expression-exp)中
在System.Data.Services.Client.DataServiceAliqExpressionVisitor.Visite(Expression exp)中
位于System.Data.Services.Client.ExpressionWriter.Visite(Expression exp)
位于System.Data.Services.Client.ExpressionWriter.Translate(表达式e)
位于System.Data.Services.Client.ExpressionWriter.ExpressionToString(DataServiceContext上下文、表达式e、布尔输入路径、版本和版本)
位于System.Data.Services.Client.UriWriter.ExpressionToString(表达式,布尔inPath)
位于System.Data.Services.Client.UriWriter.VisitQueryOptionExpression(FilterQueryOptionExpression fqoe)
位于System.Data.Services.Client.UriWriter.VisitQuery选项(ResourceExpression re)
位于System.Data.Services.Client.UriWriter.VisitResourceSetExpression(ResourceSetExpression rse)
在System.Data.Services.Client.DataServiceAliqExpressionVisitor.Visite(Expression exp)中
位于System.Data.Services.Client.UriWriter.Translate(DataServiceContext上下文、布尔addTrailingParens、表达式e、Uri和Uri、版本和版本)
位于System.Data.Services.Client.DataServiceQueryProvider.Translate(表达式e)
位于System.Data.Services.Client.DataServiceQuery`1.Translate()
位于System.Data.Services.Client.DataServiceQuery`1.QueryComponents(ClientedModel)
位于System.Data.Services.Client.DataServiceRequest.CreateExecuteSult(对象源、DataServiceContext上下文、异步回调、对象状态、字符串方法)
位于System.Data.Services.Client.DataServiceRequest.BeginExecute(对象源、DataServiceContext上下文、异步回调、对象状态、字符串方法)
位于System.Data.Services.Client.DataServiceQuery`1.BeginExecute(异步回调,对象状态)
位于System.Data.Services.Client.DataServiceQuery`1.BeginExecuteInternal(异步回调,对象状态)
位于System.Data.Services.Client.DataServiceQuery.BeginExecute(异步回调,对象状态)
在ProAlign.ServerDataModule.Services.ModelSetQueryContext.c__DisplayClassa.b__3()中
在System.Threading.Tasks.Task`1.InnerInvoke()中
位于System.Threading.Tasks.Task.Execute()}
前面提到的“常量1表达式”是指
targetId
变量的值。这意味着什么?我该怎么办?

编辑:

真正的问题可能是他们的查询没有处理EntityIdentity类,因为它可能只能处理原语。也许它正在尝试将类转换为字符串

我的建议是只处理查询中的原语

在EntityIdentity中,将Id属性更改为公共:

public long Id {get; private set;}
然后查询表达式变为:

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

我正在创建一个表达式,该表达式与下面的where等价。
您能添加该代码吗?请注意,OP:EF也将无法翻译EntityIdentity。@nmat,我确实看到了,但一开始我不相信,因为他的代码中有一些错误(ctor后面的分号和Entity中EntityIdentity的错误类名)。但是,经过进一步思考,我认为问题在于查询失败,因为它无法处理非原语。我已经更新了我的解释。生成URL时,它似乎在调用
EntityIdentity.ToString()
,返回“1”.这是“1”NotSupportedException中提到。我不明白这一点;它怎么可能不知道如何处理字符串?@RaySaltrelli,这一切归结为转换器无法转换您的类型,它可能不是targetId,但可能是Container.Entities集合中的项。从简化查询开始,不要传递class.此链接提到了例外情况:
var result = Container.Entities.Where (e => e.Id.Id.Equals(1));