我正在使用Entity Framework4.0,并试图在我的上下文对象中使用其中一个对象集的“包含”函数。为此,我编写了一个比较器类:
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();
}
}
当我尝试使用这个代码的比较器时:
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();
}
}
我得到了一个感叹:
"LINQ to Entities无法识别方法'Boolean ContainsRatingInfo‘方法,并且他的方法无法转换为存储表达式。“
因为我不精通linQ和实体框架,所以我在"GetHashCode“函数或一般情况下使用"var”时可能会犯错误。
如果我的错误很明显,你一定要告诉我:)它不会停止我的项目!但是对我来说理解为什么一个简单的比较器不能工作对我来说是很重要的。
谢谢Aaron
发布于 2010-06-22 19:08:28
LINQ to Entities的工作原理是通过IQueryable接口将表达式树转换为queries against an object model。这意味着你只能把东西放入LINQ to Entities能理解的表达式树中。
它不理解您正在使用的Contains方法,所以抛出了您所看到的异常。这是一个list of methods which it understands。
在Set Methods部分标题下,它将使用项的包含列为支持,但将带有IEqualityComparer的包含列为不支持。这大概是因为它必须能够解决如何将IEqualityComparer转换为对对象模型的查询,这将是困难的。你也许可以使用多个Where子句来做你想做的事情,看看文档后面支持哪些子句。
https://stackoverflow.com/questions/3092390
复制相似问题