![](/img/trans.png)
[英]Call a method in Select() of an Entity Framework Core method expression
[英]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.