我怎样才能编写自定义的比较(定义二进制运算符等于)为对象的EntityFramework为int?
题
我得到这个错误:
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已经知道如何字符串翻译财产成员。
不隶属于 StackOverflow