0

나는이 오류를 받고 있어요 : 내가해야 할 노력은 무엇엔티티 프레임 워크 객체에 대한 사용자 정의 비교 (이진 연산자 Equal에 대한 정의)를 int에 쓰려면 어떻게해야합니까?

ex = {"The binary operator Equal is not defined for the types 'MySite.Domain.DomainModel.EntityFramework.NickName' and 'System.Int32'."}

는 선택을했다 모든 곳 NickNameId = someIntPassedIn ... 문제는 NickNameId이는 someIntPassedIn에 비교 그렇게 할 때, 외래 키 점이다 NickNameIdNickNameId이 참조하는 전체 NickName 개체를 가져 와서 int를 해당 개체와 비교하려고합니다. 나는이 두 개체

또는

을 비교 평등 이진 연산자를 정의 할 수 있습니다 어떻게 그것을 별명 개체의 ID로 INT 비교 할 수 있도록 여기에 솔루션을 필요로

... 그래서

A)

B) 어떻게 전체 개체 대신 ID와 직접 비교할 수 있습니까?

public IList<E> SelectAllByKey(string columnName, string key) 
    { 
     KeyProperty = columnName; 
     int id; 
     Expression rightExpr = null; 

     if (int.TryParse(key, out id)) 
     { 
      rightExpr = Expression.Constant(id); 
     } 
     else 
     { 
      rightExpr = Expression.Constant(key); 
     } 

     // First we define the parameter that we are going to use the clause. 
     var xParam = Expression.Parameter(typeof(E), typeof(E).Name); 
     MemberExpression leftExpr = MemberExpression.Property(xParam, this._KeyProperty); 
     int temp; 
     BinaryExpression binaryExpr = MemberExpression.Equal(leftExpr, rightExpr); 
     //Create Lambda Expression for the selection 
     Expression<Func<E, bool>> lambdaExpr = Expression.Lambda<Func<E, bool>>(binaryExpr, new ParameterExpression[] { xParam }); 
     //Searching .... 
     IList<E> resultCollection = ((IRepository<E, C>)this).SelectAll(new Specification<E>(lambdaExpr)); 
     if (null != resultCollection && resultCollection.Count() > 0) 
     { 
      //return valid single result 
      return resultCollection; 
     }//end if 
     return null; 
    } 

당신이 더 필요하면 알려주세요 ("1"나는 "NickNameId"전달과)
가 :

당신은 여기를 읽을 필요하지 않지만 그것이 도움 넣다 SelectAllByKey 방법입니다 정보.

감사합니다,
매트

답변

2

당신은 SelectAllByKey('NickName.ID','1')를 호출해야합니다. ID 재산의 재산이기 때문에

,이 확장 방법을 사용할 수 있습니다

public static MemberExpression PropertyOfProperty(this Expression expr,string propertyName) 
{   
    var properties = propertyName.Split('.'); 

    MemberExpression expression = null; 

    foreach (var property in properties) 
    { 
     if (expression == null) 
      expression = Expression.Property(expr, property); 
     else 
      expression = Expression.Property(expression, property); 
    } 

    return expression; 
} 
+0

당신은 신입니다! 정말 고맙습니다! – Matt

2

허용 된 대답은 방법을 보인다 손에서 문제가 너무 복잡, 내가 올바르게 읽고 있어요 경우.

내가 제대로 이해하면

, 당신은 같은 쿼리를 실행하려는 :

var q = from e in Context.SomeEntities 
     where e.NickNameId == someIntPassedIn 
     select e; 

을 ...하지만 e.NickNameId 엔티티가 아닌 정수이기 때문에이 작동하지 않습니다.

Id 속성을 참조하려면, 당신은 다음과 같이 참조 할 수 있습니다 :

var q = from e in Context.SomeEntities 
     where e.NickNameId.Id == someIntPassedIn 
     select e; 

업데이트 : 당신으로 인해 추상화의 수준에 강력한 형식의 속성을 사용할 수없는 경우 (당 당신이 맞는 볼

var q = (ObjectQuery<T>)Repository.SelectSomething(); 
return q.Where("it.NickName.Id = " + someIntPassedIn.ToString()); 

당신이 적응할 수 있지만, 일반적으로 점은 EF가 이미 등록 회원 문자열을 번역하는 방법을 알고 있다는 것입니다 : 주석), 다음 query builder methods를 사용합니다.

+0

엔티티 일 때 (내가 제공 한 두 번째 엔티티를 사용해야 할 때)와 그렇지 않을 때 어떻게 알 수 있습니까? 문제는 일반적인 저장소를 사용하기 때문에 모든 것이 너무 복잡하다는 것입니다. 어느 쪽이든 그의 솔루션은 작동하고 플러그 앤 플레이만으로 불만을 제기 할 수 없습니다. – Matt

+0

강력한 형식의 참조 대신 문자열 사용에 대한 업데이트를 참조하십시오. 나는 네가 일하는 것을 가지고있어서 행복하지 않아야한다고 말하는 것이 아니다. 이것은 EF에서 할 일이 간단하다는 것입니다. –