2012-04-24 58 views
3

我在SQL Server數據庫中定義了以下2個表:實體框架 - 有條件拉從主表和歷史表中的數據在一個查詢

CREATE TABLE [dbo].[FinancialItem](
    [Id][bigint] identity(1,1) NOT NULL, 
    [TranId] [int] NOT NULL, 
    [Installment][int] NOT NULL, 
    [Amount][decimal](16,2) NOT NULL 
    CONSTRAINT [FinancialItem0] PRIMARY KEY 
    (
    [Id] ASC 
    ) 

    CREATE TABLE [dbo].[FinancialItemHistory](
    [Id][bigint] NOT NULL, 
    [TranId] [int] NOT NULL, 
    [Installment][int] NOT NULL, 
    [Amount][decimal](16,2) NOT NULL 
    CONSTRAINT [FinancialItemHistory0] PRIMARY KEY 
    (
    [Id] ASC 
    ) 

我使用實體框架4.x的與POCO實體。

實體框架代碼不會將任何數據寫入數據庫,它只是在那裏讀取其他服務創建的數據。如果可能的話,我想要做的是讓一個實體代表這兩個表中的兩個。 FinancialItem和FinancialItemHistory表具有相同的結構。當FinancialItem得到回報時,記錄從FinancialItem表移動到FinancialItemHistory表(它保持相同的Id)。如果我包含已付款項目,Entity Framework中是否有方法有條件地提取FinancialItemHistory記錄?我應該建立在本質上是做數據庫中查看此:

SELECT Id, TranId, Installment, Amount, 0 IsHistorical 
FROM FinancialItem 
UNION ALL 
SELECT Id, TranId, Installment, Amount, 1 IsHistorical 
FROM FinancialItemHistory 

我想盡可能避免使用視圖,因爲比不了的時候,我會簡單地要拉駐留在FinancialItem表未付項目。我嘗試讓兩個實體都從同一個接口(IFinancialItem)派生,然後讓實體框架查詢該接口,但似乎Entity Framework不支持在IQueryable的上下文中映射到複雜類型。

回答

2

在實體框架中,您使用Concat方法執行union all。如果您想聯合兩種不同類型的,需要雙方先轉換成通用類型是這樣的:

var table1 = ...; 
var table1 = ...; 
var unionAll = table1.Select(x => new { x.ID, ... }).Concat(table2.Select(x => new { x.ID, ... })); 
+0

權,但不會是暗示FinancialItemHistory和FinancialItem都是同一類型的? – 2012-04-24 20:12:03

+0

對。我添加了解決方案。 – usr 2012-04-24 20:13:27

+0

如果我需要在查詢中定義一個WHERE子句,然後過濾FinancialItem和FinancialItemHistory,該怎麼辦?如果不將字面數據全部帶入內存,然後進行類型轉換,然後過濾? – 2012-04-24 20:19:48