实体框架 - 在一个查询中有条件地从主表和历史记录表拉取数据

本文关键字:历史 数据 记录表 有条件 框架 查询 一个 实体 | 更新日期: 2023-09-27 18:32:04

我在 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 实体一起使用。

实体框架代码不会将任何数据写入数据库,它只是在那里读取另一个服务创建的数据。如果可能的话,我想做的是让一个实体代表这两个表。"财务项"和"财务项历史记录"表具有相同的结构。当财务项付清时,记录将从财务项表移动到财务项历史记录表(保留相同的 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 上下文中的复杂类型。

实体框架 - 在一个查询中有条件地从主表和历史记录表拉取数据

在实体框架中,使用 Concat 方法执行union all。如果要合并两种不同的类型,则需要先将两者转换为通用类型,如下所示:

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