2011-02-15 80 views
0

我有一個抽象類Contact使EF 4成爲MustOverride(抽象)成員?

這導致兩個子類:

  1. 公司(標題)
  2. 人(名字,姓氏)

我想Person表中添加一個計算的 '標題' 山坳,返回FirstName +''+ LastName,這會給我更好的搜索選項。

所以我要創建的聯繫表有一個抽象屬性名稱,每個這兩個工具的,所以,我將能夠使用:

Dim contacts = From c In context.Contacts 
       Where c.Title.Contains("Nash") 

我敢肯定這是不可能的,問題是什麼是有效的替代方法?

在我的情況我有一個顯示所有聯繫人Company和人類型一個ListBox,我有一個搜索文本框,我想服務查詢(GetContacts(searchQuery As String))查詢過濾設置對DB。

更新
威爾的回答後,我決定在Person表如上創建一個計算山坳。 的問題是什麼什麼是imlpement的WCF的RIA查詢方法最有效的方法:

Public Function GetContacts(searchQuery As String) As IQueryable(Of Contact) 
    'Do here whatever it takes to retieve from Contacts + People 
    'and mix the results of both tables ordered by Title 
End Function 

回答

2

不幸的是,儘管有一種方法與partial classes做到這一點,我99%肯定你不能混用LINQ查詢觸摸實體屬性和部分類中定義的「POCO」屬性。

Linq to Entity上下文實際上會將這些查詢轉換爲sql,並且它無法處理上下文不直接支持特定方法的情況。 L2E的一個常見示例是無法在查詢中使用枚舉。就像知道如何處理枚舉一樣,上下文在轉換爲raw sql時肯定不知道如何處理POCO屬性。

您可能想要調查的選項是在數據庫中創建計算列或運行查詢,執行傳統的ToArray()以觸發枚舉,然後檢查內存中的計算列。但是,這可能不是一個好的解決方案,具體取決於表格的大小。因此,基本上,您希望搜索兩種不同的類型(由兩個不同的表格支持),然後將結果合併顯示給用戶。我不得不說,多態不是最好的解決方案。在UI中展示它們的願望不應該強迫設計決定一直貫穿到你的類型定義中。

我在WPF中做過幾次類似的事情。我已經完成了兩種方法;通過使用包裝模型的外觀類型的形式,並且可以通過一個公共基類型處理多態,並將集合中的所有不同類型視爲System.Object。

當需要類型安全性和以相同方式處理不同類型的能力時,第一種方法是可以的。這些包裝擴展了一個公共基類,並被編碼爲「知道」如何正確處理每個包裝類型。

當你不需要類型安全性時,第二種方法是可以的,比如將一個集合暴露給一個WPF視圖時,你在一個ItemsControl中顯示它們,它可以找出正確的DataTemplate類型集合中的每個實例。

我不確定哪種方式最適合您,但無論哪種方式,您都應該分別查詢公司和個人表,Union兩個結果集,然後對其進行適當的排序。

僞代碼:

//Wrapper version 
var results = Company 
       .Where(x=>x.Title.Contains(searchTerm)) 
       .Select(x=> new CompanyWrapper(x)) 
       Cast<BaseWrapper>().Union(
        Person 
         .Where(x=>x.ComputedTitle.Contains(searchTerm)) 
         .Select(x=> new PersonWrapper(x)) 
         .Cast<BaseWrapper>()); 

//System.Object version 
var results = Company 
       .Where(x=>x.Title.Contains(searchTerm)) 
       Cast<object>().Union(
        Person 
         .Where(x=>x.ComputedTitle.Contains(searchTerm)) 
         .Cast<object>()); 

在這兩種情況下,你可能有專門垂頭喪氣。再一次,如果你需要在UI中使用它,第一種可以提供安全類型,第二種更簡單,後端需要的代碼更少,但只有在用戶界面中不需要類型安全時纔有用。

至於排序,一旦你搜索並結合了你的結果,你可以OrderBy排序結果,但是你將不得不提供一個函數來執行排序。此功能根據您選擇的版本而有所不同。

+1

+1 @ will:100%肯定 - 部分類的屬性不能在Linq-to-entities查詢中使用。標題列必須以某種方式在DB中準備 - 我建議查看。 – 2011-02-15 09:06:50