EF Core FromSQL查询没有立即执行(PostgreSQL)

时间:2016-08-29 12:51:49

标签: 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()项目,则不会插入。{p>有人能告诉我为什么会这样吗?

是否有关于使用.FromSql()或"在实体框架核心中使用Postgres功能的好文章" (我猜这是一个新功能,这就是为什么我无法找到相关数据的原因)?

1 个答案:

答案 0 :(得分:0)

  

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

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

  

因为我必须编写.FromSql(...)。Count()才能起作用。如果删除“ .Count()”项,则不会插入。有人可以告诉我为什么会这样吗?

FromSql的行为类似于WhereIQueryable上的其他功能。执行将推迟到请求结果之前执行,因为它将尝试在一个数据库查询中完成所有操作。

要确保查询实际上已执行,您需要调用一个返回IQueryable之外的值的方法,例如.Count().ToList()。可以在这里找到更多信息:https://docs.microsoft.com/en-us/ef/core/querying/overview#when-queries-are-executed