繁体   English   中英

实体框架核心,在选择中发出/生成表达式

[英]Entity Framework Core, emitting/generating expression in select

我正在.Net Core 2.2中使用Entity Framework Core,并使用了最近发布的Oracle.EntityFrameworkCore库。

我希望能够生成这样的查询...

select nvl(nullablecolumn, 'N') from table;

我想我是说对的,我不能做到这一点,至少不能开箱即用……但是我可以使用类似的东西做类似的事情(但是如果我最终写了这个,为什么不写呢?实际的SQL和跳过实体框架???)...

from row in table 
select new { somedata = row.nullablecolumn ?? "N" };

上面的linq查询为我提供的答案与我得到的答案相同……问题是,我可以做一些表达式树魔术来获得相同的结果吗?

例如,这个问题看起来像它为“ like”查询生成了一个表达式树,那么我将如何生成一个表达式树(或修改现有的表达式树)以使语句的选择端发出nvl()?

当您进行实体框架价值转换时,这将非常有用。

奖励积分(如果可以给我奖励积分),如果您可以给我一个关于如何创建表达式树来操纵查询的where端的线索... AutoMapper可以通过“投影”以某种方式进行管理?

任何想法/指针将不胜感激...

要将自己的方法调用转换为适当的SQL函数,可以使用docs中的 HasDbFunction

您必须定义自己的静态方法为

public static class OracleDbFunction
{
    public static string Nvl(string string1, string replace_with) => throw new NotImplementedException(); // You can provide matching in-memory implementation for client-side evaluation of query if needed
}

在您的DbContext中注册

protected overridevoid OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.HasDbFunction(typeof(OracleDbFunction).GetMethod(nameof(OracleDbFunctionExtensions.Nvl, builder => 
    {
        builder.HasName("nvl");
    });
}

并在您的Where表达式中将其用作

.Where(i => OracleDbFunction.Nvl(i.nullablecolumn, "N") == "N")

您还可以在OracleDbFunctionExtensions.Nvl上使用属性DbFunctionAttribute以避免在OnModelCreating注册它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM