2017-02-21 43 views
0

錯誤:無法創建類型爲「System.Object」的常量值。只有原始類型或枚舉類型在此上下文中受支持。Linq表達式不允許泛型屬性類型

確定這裏是交易, 我有一個通用的基礎機構,如下圖所示:

public abstract class Entity<Tkey> : IEntity<Tkey> 
    where Tkey:IComparable 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public abstract Tkey Id { get; set;} 

} 

我喜歡這個,因爲你知道,有些表的標識列類型的Guid,一些int和一些長。

所以,在我的通用存儲庫,我有一些像這樣的方法:

public class FRepository<TEntity,Tkey>:IDisposable where TEntity : Entity<Tkey>, new() 
    where Tkey:IComparable 

{ 

    public TEntity Find(Tkey id) 
    { 
     return this.GetAll().Where(e=> e.Id.CompareTo(id)==0).FirstOrDefault(); 
    } 
} 

GETALL()方法返回IQueryable<TEntity>.

但是,當我使用LINQ查找特定的實體,它會拋出異常,因爲我寫這篇文章的開始。

注:我想找到的實體有編號爲int類型,所以它是一種最原始的...

注1:我能不能使用「==」操作員泛型類型TKey。我收到編譯錯誤。

注-2:我也試過這Where(e=>e.Id.GetHashCode()==id.GetHashCode())。這會引發另一個錯誤(運行時)。

LINQ to Entities無法識別方法'Int32 GetHashCode()'方法,並且此方法無法轉換爲存儲表達式。

+0

我已經通過向通用存儲庫添加一個Where方法來實現此目的,該方法允許使用謂詞參數。然後我將謂詞推到一個級別爲 'return GetAll()。Where(predicate).FirstOrDefault();' –

+5

順便說一下,爲什麼'IComparable '? 'Idquatable '爲'Id'平等更好嗎? –

+1

你用'e.Id == id'得到了什麼編譯錯誤? –

回答

2

而是試圖解決原來的問題,與一些其他用戶已經註釋掉,並非所有有效表達式是翻譯的罩下的SQL語句,我會盡力給你一些建議...

摘要:

  • 你想Id實現IEquatable<TId>,不IComparable<TId>。因此,您可以編寫類似的公式:id.Equals(id2)。 BTW EF無法處理IEquatable<T>.Equals(請參閱Is it possible to use IComparable to compare entities in Entity Framework?)。無論如何,你不會再去這條路線,但建議仍然有效,你想要IEquatable<T>,而不是比較。 看下一點要知道爲什麼
  • 您不希望在您的存儲庫上使用GetAll方法以後請通過Id查找實體。對於這個確切的用例,實體框架已經有IDbSet<T>.Find method

另外,我會鼓勵你在倉庫對GetAll讀了一些答案,我在2011年由(很久以前):Repository design pattern。另外,我已經記錄了存儲庫模式here,我在那裏解釋了GetAll的事情。

相關問題