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
   )

我将 Entity Framework 4.x 与 POCO 实体一起使用。

实体框架代码不会将任何数据写入数据库,它只是用于读取另一个服务创建的数据。如果可能的话,我想做的是让一个实体代表这两个表。FinancialItem 和 FinancialItemHistory 表具有相同的结构。当一个 FinancialItem 得到还清时,记录从 FinancialItem 表移动到 FinancialItemHistory 表(它保持相同的 Id)。如果我包括已付清的项目,实体框架中是否可以有条件地提取 FinancialItemHistory 记录?我是否应该在数据库中创建一个基本上执行此操作的视图:

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

如果可能,我想避免使用视图,因为更多时候我只想提取驻留在 FinancialItem 表中的未付款项。我尝试让两个实体都从同一个接口(IFinancialItem)派生,然后让实体框架查询该接口,但似乎实体框架不支持映射到 IQueryable 上下文中的复杂类型。

4

1 回答 1

2

在实体框架中,您union all使用该Concat方法。如果你想联合两种不同的类型,你需要先把它们都转换成一个普通的类型,像这样:

var table1 = ...;
var table1 = ...;
var unionAll = table1.Select(x => new { x.ID, ... }).Concat(table2.Select(x => new { x.ID, ... }));
于 2012-04-24T20:05:08.613 回答