2010-10-29 29 views
1

我在SQL Server中一個簡單的表結構:創建一個可查詢的屬性所產生的LINQ to SQL實體

一個表中存儲的自行車(自行車)的列表和第二表存儲自行車的車主的歷史列表(擁有者)。

使用Linq 2 SQL我生成了一個模型,該模型爲我提供了一個'Bike'實體,它與'Owner'的一對多關係稱爲'HistoricalOwners'。

到目前爲止好...

現在我有我的興趣在當前所有者許多查詢。當前所有者是所有者表中的最新條目。

repo.Bikes().Where(b => b.HistoricalOwners.OrderByDescending(o => o.Date).First().Name == "Joe") 

這有效,但它有點醜,並沒有真正說我在問什麼。在我的Bike實體上創建一個'CurrentOwner'屬性並查詢它會很好。

public Owner CurrentOwner 
{ 
    get 
    { 
     return HistoricalOwners.OrderByDescending(o => o.Date).First(); 
    } 
}  

然後,我可以查詢這樣的:

repo.Bikes().Where(b => b.CurrentOwner.Name == "Joe") 

這將編譯,但在運行時cources與它會失敗:

成員 'CurrentOwner' 沒有支持轉換爲SQL。

這是總的意義。

是否有人知道我可能能夠創建一個CurrentOwner的方式,讓這個查詢工作?

我做了一些研究,讓CurrentOwner返回一個表達式樹而不是一個實例,但是我從來沒有得到任何我很滿意的地方。

然後我想知道是否可以爲我的linq 2 sql repository添加一個額外的關係給CurrentOwner並將它限制爲一對一。但我似乎無法用linq 2 sql做到這一點。我認爲我可以用Linq 2實體做到這一點,但目前這不是一種選擇。

任何人有任何想法我可以做這項工作?

由於提前,

RMK

回答

0

你試過:

public Owner CurrentOwner 
{ 
    get 
    { 
     return HistoricalOwners.OrderByDescending(o => o.Date).FirstOrDefault(); 
    } 
} 

,看看是否能轉換爲SQL?

+0

這不會起作用,它與First()沒有什麼不同,它仍然不知道如何將CurrentOwner轉換爲SQL,因爲CurrentOwner是一個屬性,因此無法轉換爲表達式 – RMK 2010-10-29 15:56:35

+0

您是否試過它作爲一種方法呢? – 2010-10-30 02:05:08

+0

這也行不通 – RMK 2010-10-30 19:41:42

0

我不認爲你可以真正做到這一點,你想能夠。

我的建議:

創建一個新的數據庫列,CurrentOwnerID,在Bike表,這是一個FK到OwnerIDOwner表。將此映射爲模型中的關聯,然後您可以按照您的要求查詢CurrentOwner

缺點是您必須根據任何其他映射屬性來管理CurrentOwner的值 - 您不能像原始示例中那樣使用其他查詢來導出它,因此它可能不適合您的應用程序。然而,這是我過去解決過這類問題的方式,它爲您的模型提供了更多的靈活性 - 您可以選擇當前所有者是誰,而不是依賴派生結果,而且這很容易理解。

+0

我曾想過這個,但我真的希望這不會是答案。我不願意介紹管理額外屬性的額外開銷+對數據庫的外部更改也必須更新這種新的關係。 – RMK 2010-10-29 15:58:19

+0

我和你一起RMK。在現有模型中,必須要做到這一點。你真正要做的是要求L2S建立@Sam建議手動添加的關係,但是在查詢中。當然L2S可以這樣做嗎? – 2010-11-01 02:02:22