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コア( 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);
    } 

誰かが2番目のコマンドが機能していない理由を教えてもらえますか?また、最初のコマンドが動作していても、それは正しい方法ですか?

私が.Count()を取り除くと、 .FromSql(...).Count()を書く.FromSql(...).Count()があるので、itemは挿入されません。誰かがなぜこれが起こっているのか教えてもらえますか?

.FromSql()や "エンティティフレームワークのコアでPostgresの機能を使う"(これは新しい機能だと思うので、これで多くのデータを見つけることができなかったのです.FromSql()使用に関する良い記事はありますか?

人気のある回答

2番目のコマンドが機能していない理由を教えてもらえますか?また、最初のコマンドが動作していても、それは正しい方法ですか?

単にPostgreSQL構文が動作する方法ではありません。 Select insert_blog({0})は確かに正しい方法です。

私は.FromSql(...)。Count()を書く必要があります。 ".Count()"を削除するとアイテムが挿入されません。誰かがなぜこれが起こっているのか教えてもらえますか?

FromSqlは、 WhereIQueryable他の関数と同じように動作します。実行は、結果が要求されるまで延期されます。これは、1つのデータベースクエリですべてを実行しようとするためです。

クエリが実際に実行されるようにするには、 .Count().ToList()などのIQueryable以外を返すメソッドを呼び出す必要があります。詳細はこちらをご覧くださいhttps : //docs.microsoft.com/en-us/ef/core/querying/overview#when-queries-are-executed



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ