c# - 泄漏 Entity Framework 的抽象——只是一点点

标签 c# linq entity-framework-6 oracle12c

如果我想访问 RDBMS 独有的功能怎么办?有没有办法将特定于数据库的 SQL 注入(inject)到 EF 生成的 SQL 中?

例如,在 Oracle 12c 中,您可以为 DDL 和 DML 添加时间有效性(有很多种;我将在此处仅使用简单示例):

这可以很好地用 C# 建模:

[TemporalAxis("valid_time")]
public class SomeEntity
{
  public string SomeField { get; set; }
}

然后与 LINQ 一起使用

var results = context.SomeEntities
                .Where(i => i.SomeField = "some_value")
                .AsOfPeriodFor("valid_time", dateVariable);

.AsOfPeriodFor 扩展可以是这样的:

public static class TemporalExtensions
{
    public static IEnumerable<TSource> AsOfPeriodFor<TSource>(this IEnumerable<TSource> source, 
        string temporalAxis, DateTime asOfDate)
    {
        // reflect on TSource to ensure it has the correct attribute/value (else degrade/throw)
        // do something to source that sets up EF to add the extra clause in the DML

        return source;
    }
}

而且我猜想 DbContext 可以反射(reflect)其实体以在初始化时驱动 DDL(我必须了解更多相关信息)。

上面的结果是 EF 将发出以下 SQL

DDL(初始化时):

create table some_table
  some_field varchar2(30)

  period for valid_time -- Need to inject this at DB Initialize time
);

DML(查询时):

select
  some_field
from 
  some_table
  as of period for valid_time to_timestamp('27-Oct-14') -- and this at query time
where
  some_field = 'some_value';

我的问题:是否有 Hook 或 IInterfaces 可用于将这些 RDBMS 专业短语注入(inject)到 EF 生成的 SQL 中?或者必须将以上内容与自定义 Oracle 数据库提供程序结合起来?这种事情有可能吗?你能给我指出可以提供指导的博客/书籍/视频/大师吗?

最佳答案

据我所知,无法修改由 EF 提供程序生成的 SQL。

但是,对于那些特殊情况,您可以直接运行 SQL。

context.Database.SqlQuery<SomeEntity>("select * from SomeEntity " +
"some more custom sql here " +
"where somecomlumn = @p1", parameter1);

您只需确保返回的内容与 SomeEntity 的形状匹配。

关于c# - 泄漏 Entity Framework 的抽象——只是一点点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26596479/

相关文章:

c# - 如何在 C# 中设置日期/时间

c# - 使用对象以外的东西锁定线程

c# - .Net 的 LINQ 中存在错误,或者我遗漏了什么?

.net - 如何在 F# 中通过 LINQ 选择匿名类型

c# - 无法将类型 'DynamicClass1' 转换为类型 <T>。 LINQ to Entities 仅支持转换 EDM 原语或枚举类型

c# - ASP.Net C# MVC5 Razor 查看 XML 站点地图

c# - 重定向到另一个未在路由中注册的 Controller /操作

c# - System.ObjectDisposeException : 'Cannot access a disposed object.Object name: ' OracleConnection'. '

c# - LINQ to Entities 无法识别方法 'System.String ToString()' 方法,并且该方法无法转换为存储表达式

c# - 对 EF 中的跟踪感到困惑(使用子集合更新实体)