如果我想访问 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/