Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何将entityframework对象的自定义比较(二进制运算符Equal的定义)写入int?_Asp.net Mvc_Entity Framework_Repository_Binary Operators_Object Comparison - Fatal编程技术网

Asp.net mvc 如何将entityframework对象的自定义比较(二进制运算符Equal的定义)写入int?

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) 如何定义

我得到了这个错误:

ex={“没有为类型'MySite.Domain.DomainModel.EntityFramework.昵称'和'System.Int32'定义二进制运算符Equal”。”

我试图做的是在
昵称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中是微不足道的。