Linq IEqualityComparer异常

Linq IEqualityComparer异常,linq,entity-framework,c#-4.0,Linq,Entity Framework,C# 4.0,我正在使用EntityFramework4.0,并试图在我的上下文对象中使用一个对象集的“Contains”函数。为此,我编写了一个比较器类: public class RatingInfoComparer : IEqualityComparer<RatingInfo> { public bool Equals(RatingInfo x, RatingInfo y) { var a = ne

我正在使用EntityFramework4.0,并试图在我的上下文对象中使用一个对象集的“Contains”函数。为此,我编写了一个比较器类:

    public class RatingInfoComparer : IEqualityComparer<RatingInfo>
    {           
        public bool Equals(RatingInfo x, RatingInfo y)
        {
            var a = new {x.PlugInID,x.RatingInfoUserIP};
            var b = new {y.PlugInID,y.RatingInfoUserIP};

            if(a.PlugInID == b.PlugInID && a.RatingInfoUserIP.Equals(b.RatingInfoUserIP))
                return true;
            else
                return false;
        }

        public int GetHashCode(RatingInfo obj)
        {
            var a = new { obj.PlugInID, obj.RatingInfoUserIP };

            if (Object.ReferenceEquals(obj, null))
                return 0;
            return a.GetHashCode(); 
        }


    }
公共类评级信息比较程序:IEqualityComparer
{           
公共布尔等于(比率信息x,比率信息y)
{
var a=新的{x.PlugInID,x.ratinginfo用户ip};
var b=新的{y.PlugInID,y.ratinginfo用户ip};
如果(a.PlugInID==b.PlugInID&&a.RatingInfoUserIP.Equals(b.RatingInfoUserIP))
返回true;
其他的
返回false;
}
public int GetHashCode(RatingInfo obj)
{
var a=新的{obj.PlugInID,obj.ratinginfo-userip};
if(Object.ReferenceEquals(obj,null))
返回0;
返回a.GetHashCode();
}
}
当我尝试将比较器与以下代码一起使用时:

    public void SaveRatingInfo2(int plugInId, string userInfo)
    {

        RatingInfo ri = new RatingInfo()
        {
            PlugInID = plugInId,
            RatingInfoUser = userInfo,
            RatingInfoUserIP = "192.168.1.100"
        };

        //This is where i get the execption
        if (!context.RatingInfoes.Contains<RatingInfo>(ri, new RatingInfoComparer()))
        {
            //my Entity Framework context object
            context.RatingInfoes.AddObject(ri);
            context.SaveChanges();
        }
    }
public void saveratinginfo(int-plugInId,string-userInfo)
{
RatingInfo ri=新的RatingInfo()
{
PlugInID=PlugInID,
RatingInfo用户=用户信息,
RatingInfo用户IP=“192.168.1.100”
};
//这就是我得到执行权的地方
如果(!context.ratinginfo.Contains(ri,new ratinginfo comparer()))
{
//我的实体框架上下文对象
context.ratinginfo.AddObject(ri);
SaveChanges();
}
}
我得到一个选项:

“LINQ to Entities无法识别方法'Boolean Contains[RatingInfo](System.LINQ.IQueryable
1[OLAFCMLibrary.Models.RatingInfo],OLAFCMLibrary.Models.RatingInfo,
System.Collections.Generic.IEqualityComparer
1[OlafCMSLibrary.Models.RatingInfo])方法,其方法无法转换为存储表达式。“

由于我不精通linQ和实体框架,我在“GetHashCode”函数或一般情况下使用“var”可能会犯错误

如果我的错误对你来说很清楚,请告诉我:)它不会停止我的项目!但我必须理解为什么一个简单的比较器不起作用

谢谢
Aaron

LINQ to Entities通过IQueryable接口将表达式树转换为。这意味着您只能将内容放入LINQ to实体理解的表达式树中

它不理解您正在使用的Contains方法,因此会抛出您看到的异常。这是一本书

在设置方法部分标题下,它列出了支持使用项的包含,但列出了不支持使用IEqualityComparer的包含。这大概是因为它必须能够解决如何将IEqualityComparer转换为针对对象模型的查询,这将很困难。您可能可以使用多个Where子句来执行所需操作,请查看文档后面支持哪些子句。

谢谢!!!关于“支持和不支持的LINQ方法”的链接似乎回答了我的问题。它不受支持,这是获得此特定异常的一个很好的原因:)谢谢,Aharale