首页 > 解决方案 > 实体框架核心,在选择中发出/生成表达式

问题描述

我在 .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”查询生成了一个表达式树,那么我将如何生成一个表达式树(或修改现有的表达式树)以使语句的 select 端发出 nvl()?

如果您有实体框架值转换,这将很有用......

如果你能给我一个关于如何创建表达式树来操作查询的 where 端的线索,那么加分(如果我可以给加分的话)...... AutoMapper 用“投影”以某种方式管理这个?

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

标签: c#entity-framework-core

解决方案


要将您自己的方法调用转换为正确的 SQL 函数,您可以HasDbFunction使用docs

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

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")

您还可以使用属性DbFunctionAttributeonOracleDbFunctionExtensions.Nvl来避免将其注册到OnModelCreating


推荐阅读