EF Core FromSQL查詢不會立即執行(PostgreSQL)

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

我在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()或“在實體框架核心中使用Postgres函數”的好文章(我猜這是一個新功能,這就是為什麼我找不到這方面的大量數據)?

熱門答案

有人可以告訴我為什麼第二個命令不起作用?即使第一個命令正在工作,它是否正確?

它只是不是PostgreSQL語法的工作方式。 Select insert_blog({0})確實是正確的方法。

因為我必須寫.FromSql(...)。Count()才能使它工作。如果我刪除“.Count()”項目未插入。有人能告訴我為什麼會這樣嗎?

FromSql行為就像IQueryable上的Where和其他函數一樣。執行被推遲到請求結果,因為它將嘗試在一個數據庫查詢中執行所有操作。

為了確保您的查詢實際執行,您需要調用一個返回IQueryable以外的東西的方法,如.Count().ToList() 。更多信息可以在這裡找到: https//docs.microsoft.com/en-us/ef/core/querying/overview#when-queries-are-executed



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow