2013-05-24 1 views
1

IEnumerable.Where()를 사용하는 식을 수동으로 작성하여 WCF 데이터 서비스 클라이언트 측 프록시에서 DataServiceQuery를 필터링합니다. 위의 수업을 감안할 때 NotSupportedException : 상수 1 식을 문자열로 변환 할 수 없습니다.

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)에 해당합니다 식을 만드는 오전.

{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()} 

전술 "상수 1 식의"targetId 변수의 값을 의미한다 :이 쿼리를 해결하려고하면

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

는 LINQ 투 URI 변환기는 다음과 같은 예외가 발생. 이것이 의미하는 바는 무엇이며 어떻게해야합니까?

+0

'나는 where.' 다음에 동등 물이 식을 만드는 오전 이 코드를 추가 할 수 있습니까? – nmat

답변

2

편집 :

진짜 문제는 그들이 단지 프리미티브를 처리 할 수있을 수 있으므로 EntityIdentity 클래스 처리되지 않은 쿼리 것을 할 수있다. 아마도 클래스를 문자열로 변환하려고합니다.

내 제안은 쿼리의 프리미티브 만 사용하는 것입니다.

public long Id {get; private set;} 

그리고 쿼리 표현이된다 :

EntityIdentity에서

Id 속성을 변경 대중에게

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

OP : EF에 대한 참고 사항도 EntityIdentity를 변환하지 못합니다. – usr

+0

그의 코드'targetID'에 따르면 – nmat

+0

@ nmat입니다. 나는 그것을 보았습니다.하지만 코드에 몇 가지 오류가 있기 때문에 처음에는 그것을 믿지 않았습니다. (ctor와 잘못된 클래스 뒤에 세미콜론이 있습니다. Entity의 EntityIdentity에 대한 이름). 그러나 더 많은 생각을 한 후에는 비 프리미티브를 처리 할 수 ​​없기 때문에 쿼리가 실패하고 있다고 생각합니다. 나는 나의 설명을 갱신했다. –