web-dev-qa-db-ja.com

EF Core 2.0 SQLストアドプロシージャの使用方法

ストアドプロシージャを使用してEF Core 2.0を初めて使用します。

EF Core 2.0のコードファーストアプローチでストアドプロシージャを使用する方法を教えてください。

以前のプロジェクトでは、.edmxモデルファイル、次のようにコンテキストを使用していました。

public IEnumerable<UserResult> GetUserResults(Entities context)
{
    if (context == null) return new List<UserResult>();
    return context.spGetUsers().Where(u => u.IsDeleted == false);
}

コンテキストは次のとおりです。

public virtual ObjectResult<UserResult> spGetUsers()
{
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<UserResult>("spGetUsers");
}

ありがとう

9
Mukil Deepthi

FromSQLメソッドを使用できます。

var blogs = context.Blogs
    .FromSql("EXECUTE dbo.GetMostPopularBlogs")
    .ToList();

https://docs.Microsoft.com/en-us/ef/core/querying/raw-sql

10
ErikEJ

他の人を1時間ほど救うには...

ErikEJの答えは完璧に機能しますが、最初にやることがいくつかあります。

(ストアドプロシージャを含む既存のデータベースへの)リバースコードの最初の移行後、既存のデータベースのストアドプロシージャが標準テーブル(Blogのリスト)を返さず、別のクラスを返すという問題がありました(例:BlogTitleAndSummaryのリスト)。これはデータベースにありませんでした(したがって、移行)。

この投稿では、 エンティティタイプである必要があります がわかりませんでしたが、Eriksの投稿の another は正しい方向を示しました。

このシナリオを機能させるには:

「BlogTitleAndSummary」のクラスを作成し、1つのプロパティを[key]

例えば.

public class BlogTitleAndSummary
{
    [Key]
    public int BlogId { get; set; }

    public string Title { get; set; }

    public string ShortSummary { get; set; }
}

次に、それをコンテキストのDbSetとして追加しました。

public partial class BloggingContext : DbContext
{
    public BloggingContext()
    {
    }

    public BloggingContext(DbContextOptions<BloggingContext> options)
        : base(options)
    {
    }

    // Might be best to move these to another partial class, so they don't get removed in any updates.
    public virtual DbSet<BlogTitleAndSummary> BlogTitleAndSummary { get; set; }

    // Standard Tables
    public virtual DbSet<Blog> Blog { get; set; }
    ...
}

これにより、ストアドプロシージャを呼び出すために次の構文を使用できました。

注:以下のコメントに従ってこれを更新しました。 FromSqlメソッドでparamsを使用します。このような SQLクエリ には文字列補間を使用しないでください。

using (var ctx = new BloggingContext())
{
var dbResults = ctx.BlogTitleAndSummary.FromSql("EXEC dbo.get_bloggingSummary @UserId={0}", userId).ToList();
}
5
HockeyJ