我得到这个错误:

  

EX = { “的二进制运算符等于未对该类型 'MySite.Domain.DomainModel.EntityFramework.NickName' 和 'System.Int32'。定义”}

我试图做的是做一个选择都在NickNameId = someIntPassedIn ...问题是,NickNameId是一个外键,所以当它的someIntPassedIn比作NickNameId它拉了整个NickName对象的NickNameId指并试图整型比较到该对象。

我需要一个解决方案在这里,以允许它为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;
    }

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

谢谢,结果 马特

有帮助吗?

解决方案

您应该叫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;
}

其他提示

接受的答案似乎的办法的太复杂了手头的问题,如果我正确地读这一点。

如果我理解正确的话,你想运行就像一个查询:

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已经知道如何字符串翻译财产成员。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top