c# - 实体框架核心,在选择中发出/生成表达式
问题描述
我在 .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 用“投影”以某种方式管理这个?
任何想法/指针将不胜感激......
解决方案
要将您自己的方法调用转换为正确的 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")
您还可以使用属性DbFunctionAttribute
onOracleDbFunctionExtensions.Nvl
来避免将其注册到OnModelCreating
推荐阅读
- scala - 使用scala反射将参数传递给方法时出错
- javascript - 如何从 AXIOS 获取请求返回的 JSON 中选择项目
- c# - 无法检测到右键单击鼠标向下和向上事件
- go - 为什么 go module 伪版本有特定版本?
- python - 下载时 Gdrive API 未检测到所选文件夹中的所有文件
- java - 在 Java 中使用 Reactor Webclient 的代理配置返回 405 Method not allowed
- blockchain - 使用 Truffle 部署合约的 53 位问题
- cuda - 从 __host__ __device__ 函数调用 __host__ 函数
- .net - 有没有办法用 C# .net core 编辑 pdf?
- asp.net-core - .NET CORE WEB API 接受整数列表作为 HTTP GET API 中的输入参数