0

我有一个使用实体框架的.Net MVC 应用程序,通常我会在数据实体中使用表或视图......例如。

[Table("company_details", Shema = "abd")]
public class CompanyDetails
{
    [Key]
    [Column("cd_id_pk")]
    public int CompanyDetailsId { get; set; }
    etc ...
    etc ...

...其中 company_details 是一个 oracle 表。

但是我需要尝试使用流水线函数....例如 sql 将是:

SELECT * FROM TABLE(abd.company_pck.f_single_rprt('1A122F', '01-Feb-2020','Y'));

这已在 Oracle 表单中使用的报告中使用,但现在将包含在 .Net MVC 应用程序中。

如何在我的实体中包含流水线功能?

提前致谢

4

1 回答 1

1

我刚试过这个,它似乎工作。首先创建一个类,以便能够映射 DbContext 的返回。在您的情况下,您只需从 Oracle 调用 Pipelined 表函数。我在 SQL 中使用了一个 TVF 来演示。TVF 返回 3 列数据,2 个 INT 和 1 个 NVarChar。

public class ReturnThreeColumnTableFunction
{
    public int ColumnOne { get; set; }
    public int ColumnTwo { get; set; }
    public string ColumnThree { get; set; }
}

然后基于你的 Oracle Pipelined 函数,(见下面我的 MSSQL TVF)

/* SQL TableValuedFunction */
ALTER FUNCTION [dbo].[ReturnThreeColumnTableFunction]
(   
    @ColumnOne INT,
    @ColumnTwo INT,
    @ColumnThree NVARCHAR(10)
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT @ColumnOne AS ColumnOne, @ColumnTwo AS ColumnTwo, @ColumnThree AS ColumnThree
)

然后在您的 DbContext 类中设置您的 CodeFirst 实体,确保在 OnModelCreating 方法中添加复杂类型。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.ComplexType<ReturnThreeColumnTableFunction>();
    modelBuilder.ComplexType<ReturnThreeColumnTableFunction>().Property(x => x.ColumnOne).HasColumnName("ColumnOne");
    modelBuilder.ComplexType<ReturnThreeColumnTableFunction>().Property(x => x.ColumnTwo).HasColumnName("ColumnTwo");
    modelBuilder.ComplexType<ReturnThreeColumnTableFunction>().Property(x => x.ColumnThree).HasColumnName("ColumnThree");
}

然后使用 SqlQuery 轻松返回

var items = context.Database.SqlQuery<ReturnThreeColumnTableFunction>("SELECT * FROM dbo.ReturnThreeColumnTableFunction(1,2,'3')")

在此处输入图像描述

于 2020-02-05T18:12:25.380 回答