2010-02-24 55 views
0

兩個表(MainTable和EventType)。 EventType在代碼中表示爲枚舉,並在數據庫中被外鍵控制,使其看起來像;使用Entity Framework如何使用多個枚舉值通過外鍵過濾?

Public enum EventTypeId As Integer 
    Blah = 1 
    Blurgh = 2 
    Whoo = 3 
End Enum 

我可以運行以下查詢罰款;

From M in dbx.MainTable Where M.EventType.EventTypeId = 1 

但我不能這樣做(psuedo code);

From M in dbx.MainTable Where M.EventType.EventTypeId.Contains(EventTypeId.Blah,EventTypeId.Whoo) 

的第二個方法是更具可讀性和可維護性,因爲它鏈接到枚舉,但我不能找到EF一個結構,它允許我做這件事。

這是EF的當前版本,而不是.Net 4.0。

總之,我想在SQL中做什麼很容易,只需要在EF中;

Select * From MainTable Where EventTypeId In (1,3); 
+0

我發現[一個類似的問題(http://stackoverflow.com/questions/328600/how-do-you-do-a的列表的一部分-sql-style-in-statement-in-linq-to-entities-entity-framework-i)關於LINQ中的IN語句。 – p2u 2010-02-24 13:01:52

回答

1

如果你看你想要什麼:

綜上所述,我想在SQL做的很簡單,它只是需要在 EF;

Select * From MainTable Where EventTypeId In (1,3); 

,你應該把它解釋爲:EventTypeId 應該是(1,3)的一部分。 此相對應的是:(1,3)包含EventTypeId

你所想的是:

但我不能這樣做(僞代碼)

From M in dbx.MainTable Where M.EventType.EventTypeId.Contains(EventTypeId.Blah,EventTypeId.Whoo) 

但是,您正在嘗試:EventTypeId 包含(1,3)

解決的辦法是什麼待辦事項你真的想在SQL中包含語法,而是把它周圍:你應該找(1,3)包含EventTypeId

因此,創建一個int列表與特定事件類型的id你正在找。 然後過濾所有的記錄,其中EventTypeId是ID的

List<int> eventTypeIds = new List<int>(); 
eventTypeIds.Add((int)EventTypeId.Blah); 
eventTypeIds.Add((int)EventTypeId.Whoo); 

From M in dbx.MainTable Where eventTypeIds.Contains(M.EventTypeId) 
1

從未嘗試過類似的東西,但你有沒有測試,如果它的工作原理是您鑄造枚舉爲整數,如下面的?

(int)EventTypeID.Blah 

對不起,如果不嘗試自己,不能幫上太多忙,現在什麼是不可能的。

+0

不好,它也討厭它,因爲它試圖做數據庫方面並抱怨說它不知道類型。 – 2010-02-24 14:27:50