我刚试过这个,它似乎工作。首先创建一个类,以便能够映射 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')")