0

我收到此错误:

ex = {"二元运算符 Equal 没有为类型 'MySite.Domain.DomainModel.EntityFramework.NickName' 和 'System.Int32' 定义。"}

我试图做的是选择所有NickNameId = someIntPassedIn...问题是NickNameId是一个外键,所以当它比较时它someIntPassedInNickNameId拉出引用的整个NickName对象NickNameId并尝试比较int目的。

我需要一个解决方案来允许它将 int 与 NickName 对象的 Id 进行比较......所以

A)如何定义二元运算符 Equal 来比较这两个对象

或者

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

如果您需要更多信息,请告诉我。

谢谢,
马特

4

2 回答 2

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;
}
于 2009-12-20T21:40:25.037 回答
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 已经知道如何将字符串转换为属性成员。

于 2009-12-22T13:37:05.860 回答