postgresql - EF Core FromSQL 查询不会立即执行 (PostgreSQL)

标签 postgresql function stored-procedures entity-framework-core .net-core

我在PostgreSQL中写了一个插入函数如下:

CREATE OR REPLACE FUNCTION public.insert_blog("Url" character)
  RETURNS void AS
$BODY$Begin
    Insert Into "Blogs"("Url") Values("Url");
End$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.insert_blog(character)
  OWNER TO postgres;

上述函数在Blogs 表中添加了一个条目(Url 是一个参数)。

我正在尝试在 .Net Core (Npgsql.EntityFrameworkCore.PostgreSQL) 中使用这个函数,如下所示:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Create(Blog blog)
    {
        if (ModelState.IsValid)
        {
            //This works fine
            var count = _context.Blogs.FromSql("Select insert_blog({0})", blog.Url).Count(); 

            //This doesn't work -- it gives an error of "42601: syntax error at or near "insert_blog""
            //var count = _context.Blogs.FromSql("insert_blog @Url={0}", blog.Url).Count();                

            return RedirectToAction("Index");
        }

        return View(blog);
    } 

有人能告诉我为什么第二个命令不起作用吗?另外,即使第一个命令有效,这是正确的方法吗?

由于我必须编写 .FromSql(...).Count() 才能使其正常工作,如果我删除 .Count() 项目不会'不会被插入。有人能告诉我为什么会这样吗?

是否有任何关于使用 .FromSql() 或“在 Entity Framework 核心中使用 Postgres 函数”的好文章(我猜这是一个新功能,这就是为什么我不能找到很多这方面的数据)?

最佳答案

Can some one tell me why the second command is not working? Also even if the first command is working, is it the right way?

这根本不是 PostgreSQL 语法的工作方式。 选择 insert_blog({0}) 确实是正确的方法。

Since I have to write .FromSql(...).Count() in order for it to work. If I remove ".Count()" item doesn't get inserted. Can someone tell me why this is happening?

FromSql 的行为就像 WhereIQueryable 上的其他函数。执行被推迟到请求结果之前,因为它将尝试在一个数据库查询中完成所有事情。

为了确保您的查询真正得到执行,您需要调用一个返回除 IQueryable 之外的东西的方法,例如 .Count().ToList ()。更多信息可以在这里找到:https://learn.microsoft.com/en-us/ef/core/querying/overview#when-queries-are-executed

关于postgresql - EF Core FromSQL 查询不会立即执行 (PostgreSQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39206807/

相关文章:

PHP/mySQL Insert 然后调用存储过程获取id

python - 在 Postgres/PostGIS 中迁移 django 模型没有反射(reflect)

MySQL嵌套查询速度

javascript - 如何使用 php-function-output 作为 javascript 的输入?

c++ - 别名成员对象方法的最佳方法? "Passthrough methods"

java - 将对象从 Java 传递到 Oracle 过程

sql - 选择连接到其他两个特定行的行

sql - PostgreSQL 按顺序选择数组

c - 质量之间的引力

c# - 如何将枚举转换为字节数组?