2010-06-22 55 views
1

我正在使用實體框架4.0,並試圖使用我的上下文對象中的一個對象集的「包含」功能。這樣做,我編寫了一個比較器類:IEqualityComparer異常

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(); 
     } 
    } 

我得到一個execption:

「LINQ到實體不承認方法'布爾Contains [RatingInfo](System.Linq.IQueryable 1[OlafCMSLibrary.Models.RatingInfo], OlafCMSLibrary.Models.RatingInfo, System.Collections.Generic.IEqualityComparer 1 [OlafCMSLibrary.Models.RatingInfo])'方法,並且他的方法不能被轉換成存儲表達式。「

由於我不熟練使用linQ和Entity Framework,我可能會在「GetHashCode」函數中使用「var」,或者一般來說會犯一個錯誤。

如果我的錯誤是明確的,你告訴我:)它不會停止我的項目!但對於我來說,理解爲什麼一個簡單的比較器不起作用至關重要。

由於 亞倫

回答

2

LINQ到實體的工作原理是通過IQueryable的接口變換表達式樹到queries against an object model。這意味着你只能將東西放入LINQ to Entities能夠理解的表達式樹中。

它不理解您正在使用的Contains方法,因此它會拋出您看到的異常。這是一個list of methods which it understands

設置方法節標題中,它列出了使用某個項目作爲支持的Contains,但它列出了Contains並且IEqualityComparer不受支持。這大概是因爲它必須能夠解決如何將IEqualityComparer轉換爲對象模型的查詢,這很困難。您可以使用多個Where子句來執行您想要的操作,查看文檔中哪些是受支持的。

+0

謝謝! 關於「支持和不支持的LINQ方法」的鏈接似乎回答了我的問題。它不支持這是獲得此特定例外的好理由:) 謝謝, Aharale – Aharon 2010-06-29 14:51:10