0

我得到这个错误:如何将entityframework对象的自定义比较(二元运算符Equal的定义)写入int?

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

我试图做的是做一个选择都在NickNameId = someIntPassedIn ...问题是,NickNameId是一个外键,所以当它比较someIntPassedInNickNameId它拉动NickNameId引用的整个NickName对象,并尝试将int与该对象进行比较。

我在这里需要一个解决方案,使其能够比较的int昵称对象的ID ......所以

A)我如何定义二元运算符平等比较这两个对象

OR

B)我怎样才能直接比较它的ID而不是整个对象?

您不必阅读本,但这里的SelectAllByKey方法柜面它可以帮助:
(我在“NickNameId”过去了,“1”)

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; 
    } 

让我知道如果你需要更多的信息。

谢谢
马特

回答

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 2009-12-20 22:31:49

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; 

如果您不能使用强类型的属性,由于你的抽象级别(按你的评论),然后使用query builder methods

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

,你认为合适,您可以适应这一点,但总的一点是,EF已经知道如何转换字符串财产成员。

+0

这是正确的,除了我应该知道什么时候它是一个实体(当我应该使用你提供的第二个实体时)以及什么时候不是?问题是,我正在使用一个通用的存储库,所以关于它的一切都太复杂了......无论哪种方式,他的解决方案工作,只是即插即用,所以我不能抱怨。 – Matt 2009-12-22 22:44:42

+0

查看使用字符串而不是强类型引用的更新。我并不是说你不应该感到高兴,你有什么可行的东西;只是这在EF中很重要。 – 2009-12-23 02:22:22