2017-03-08 39 views
5

是否有可能orderby實體上的虛擬財產?OrderBy在實體框架中的虛擬財產

我也有類似的一類:

public int Id{get;set;} 
public string Name {get;set;} 

public virtual string TestName 
{ 
    get { return string.Format("{0}{1}", Name , Id); } 
} 

當我在測試名屬性命令,我得到的錯誤:

"The specified type member 'TestName' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."

我本來的方法在部分類,屬性用於返回數據但不排序。

有沒有辦法解決這個問題?

+0

我懷疑你必須指定只讀或非映射。 – Schwarzie2478

+1

該錯誤與該屬性爲「虛擬」無關。你會得到這個錯誤,因爲你調用'OrderBy'的集合是'IQueryable '因此EF試圖創建** SQL **。由於數據庫不知道該屬性,因此無法通過它進行排序。 –

回答

3

而不是僅僅.OrderBy(x => x.TestName)你必須在你的EF查詢中使用.ToList().OrderBy(x => x.TestName)

這是因爲TestName屬性不作爲數據庫表中的列存在,並且查詢無法轉換爲SQL語句。調用將把查詢轉化爲C#集合,然後可以對其進行排序。

+0

這將工作,但我試圖對這個類和ToList()的大集合做一個搜索查詢會影響性能 –

1

您可以使用DelegateDecompiler將屬性內的代碼展開爲表達式樹,這意味着Linq to Entities可以從中生成SQL。

https://github.com/hazzik/DelegateDecompiler

你只需要裝飾與[Computed]屬性的屬性,並調用.Decompile()作爲LINQ查詢的一部分。