Asp.net mvc 如何将entityframework对象的自定义比较(二进制运算符Equal的定义)写入int?
我得到了这个错误: ex={“没有为类型'MySite.Domain.DomainModel.EntityFramework.昵称'和'System.Int32'定义二进制运算符Equal”。” 我试图做的是在Asp.net mvc 如何将entityframework对象的自定义比较(二进制运算符Equal的定义)写入int?,asp.net-mvc,entity-framework,repository,binary-operators,object-comparison,Asp.net Mvc,Entity Framework,Repository,Binary Operators,Object Comparison,我得到了这个错误: ex={“没有为类型'MySite.Domain.DomainModel.EntityFramework.昵称'和'System.Int32'定义二进制运算符Equal”。” 我试图做的是在昵称ID=someIntPassedIn中执行全选。。。问题是昵称ID是一个外键,因此当它将someIntPassedIn与昵称ID进行比较时,它会提取昵称ID引用的整个昵称对象,并尝试将int与该对象进行比较 我需要一个解决方案,允许它比较int和昵称对象的Id。。。所以 A) 如何定义
昵称ID=someIntPassedIn
中执行全选。。。问题是昵称ID是一个外键,因此当它将someIntPassedIn
与昵称ID
进行比较时,它会提取昵称ID
引用的整个昵称
对象,并尝试将int与该对象进行比较
我需要一个解决方案,允许它比较int和昵称对象的Id。。。所以
A) 如何定义用于比较这两个对象的二进制运算符Equal
或
B) 如何将其直接与id(而不是整个对象)进行比较
您不必阅读此内容,但这里有一个SelectAllByKey方法,以防它有所帮助:(我输入了“昵称ID”和“1”)
public IList SelectAllByKey(字符串列名称,字符串键)
{
KeyProperty=columnName;
int-id;
表达式rightExpr=null;
if(内部TryParse(键,输出id))
{
rightExpr=表达式常数(id);
}
其他的
{
rightExpr=表达式常数(键);
}
//首先,我们定义要使用子句的参数。
var xParam=Expression.Parameter(typeof(E),typeof(E).Name);
MemberExpression leftExpr=MemberExpression.Property(xParam,this.\u keyperty);
内部温度;
BinaryExpression binaryExpr=MemberExpression.Equal(leftExpr,rightExpr);
//为所选内容创建Lambda表达式
表达式lambdaExpr=Expression.Lambda(binaryExpr,新参数Expression[]{xParam});
//搜索。。。。
IList resultCollection=((IRepository)this).SelectAll(新规范(lambdaExpr));
if(null!=resultCollection&&resultCollection.Count()>0)
{
//返回有效的单个结果
返回结果集合;
}//如果结束
返回null;
}
如果你需要更多信息,请告诉我
谢谢,Matt您应该调用
选择AllByKey('昵称.ID','1')
由于ID
是property的属性,因此可以使用以下扩展方法:
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;
}
您应该调用
SelectAllByKey('昵称.ID','1')
由于ID
是property的属性,因此可以使用以下扩展方法:
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.昵称id
是一个实体,而不是整数
要引用Id
属性,只需引用它,如下所示:
var q = from e in Context.SomeEntities
where e.NickNameId.Id == someIntPassedIn
select e;
更新:如果由于您的抽象级别(根据您的评论)而无法使用强类型属性,请使用:
var q=(ObjectQuery)Repository.SelectSomething();
返回q.Where(“it.昵称.Id=“+someIntPassedIn.ToString());
您可以根据自己的需要对其进行调整,但总的来说,EF已经知道如何将字符串转换为属性成员。如果我没有看错的话,对于手头的问题来说,公认的答案似乎太复杂了
如果我理解正确,您正在尝试运行以下查询:
var q = from e in Context.SomeEntities
where e.NickNameId == someIntPassedIn
select e;
…但这不起作用,因为e.昵称id
是一个实体,而不是整数
要引用Id
属性,只需引用它,如下所示:
var q = from e in Context.SomeEntities
where e.NickNameId.Id == someIntPassedIn
select e;
更新:如果由于您的抽象级别(根据您的评论)而无法使用强类型属性,请使用:
var q=(ObjectQuery)Repository.SelectSomething();
返回q.Where(“it.昵称.Id=“+someIntPassedIn.ToString());
您可以根据自己的需要对其进行调整,但一般来说,EF已经知道如何将字符串转换为属性成员。您真是个神!非常感谢你!你是上帝!非常感谢你!这是正确的,除了我应该如何知道它何时是一个实体(何时我应该使用您提供的第二个实体)以及何时不是?问题是,我使用的是一个通用存储库,所以它的一切都太复杂了。。。不管怎样,他的解决方案都是有效的,只是即插即用,所以我没什么可抱怨的。关于使用字符串而不是强类型引用,请参阅更新。我并不是说你不应该因为你有了一些有用的东西而感到高兴;只是这在EF中是微不足道的。这是正确的,除了我应该如何知道它何时是一个实体(何时我应该使用您提供的第二个实体)以及何时不是?问题是,我使用的是一个通用存储库,所以它的一切都太复杂了。。。不管怎样,他的解决方案都是有效的,只是即插即用,所以我没什么可抱怨的。关于使用字符串而不是强类型引用,请参阅更新。我并不是说你不应该因为你有了一些有用的东西而感到高兴;只是这在EF中是微不足道的。