1. ホーム
  2. c#

[解決済み】DbSetを使用しない生のSQLクエリ - Entity Framework Core

2022-04-19 05:01:43

質問

Entity Frameworkのコア削除で dbData.Database.SqlQuery<SomeModel> テーブルデータとランクを返す全文検索クエリ用の生のSQLクエリを構築するソリューションが見つかりません。

Entity Framework Core で生の SQL クエリを構築する方法は、私が見た限り、次のとおりです。 dbData.Product.FromSql("SQL SCRIPT"); これは、クエリで返すランクをマッピングするDbSetがないため、役に立ちません。

何かアイデアはありますか?

解決方法は?

を使用しているかどうかによります。 EFコア2.1 または EF Core 3 以降のバージョン .

EF Core 2.1 を使用している場合

2018年5月7日から利用可能なEF Core 2.1 Release Candidate 1を使用している場合、提案されている新機能であるQuery typeを利用することができます。

とは クエリタイプ ?

エンティティタイプに加えて、EF Coreモデルはクエリタイプを含むことができます。 のデータに対してデータベースクエリを実行するために使用されます。 は、エンティティ型にマッピングされていない。

クエリタイプはどのような場合に使用するのですか?

その場しのぎの FromSql() クエリの戻り値型として使用します。

データベースビューへのマッピング。

主キーが定義されていないテーブルへのマッピング。

モデルで定義されたクエリへのマッピング。

そのため、質問の回答として提案されたすべてのハックや回避策を行う必要はもうありません。以下のステップを踏むだけです。

まず、新しいプロパティを定義し、そのタイプは DbQuery<T> ここで T は、SQL クエリのカラムの値を保持するクラスの型です。ですから DbContext とすると、こうなります。

public DbQuery<SomeModel> SomeModels { get; set; }

次に FromSql メソッドと同じように DbSet<T> :

var result = context.SomeModels.FromSql("SQL_SCRIPT").ToList();
var result = await context.SomeModels.FromSql("SQL_SCRIPT").ToListAsync();

また、以下のことに注意してください。 DdContext 部分クラス そのため、'raw SQL DbQuery' の定義を整理するために、1つまたは複数の別々のファイルを作成することができます。


EF Core 3.0以上のバージョンを使用している場合

クエリタイプは現在 キーレスエンティティ型 . 上記のように、クエリタイプはEF Core 2.1で導入されました。EF Core 3.0以上のバージョンを使用している場合、クエリタイプが廃止されたため、キーレスエンティティタイプを使用することを検討する必要があります。

<ブロッククオート

この機能はEF Core 2.1でクエリタイプという名前で追加されました。 EF Core 3.0では、このコンセプトはキーレスエンティティタイプに名前が変更されました。その EFCore 5.0では、[キーレス]データアノテーションが利用可能になりました。

キーレスエンティティタイプを使用する場合のシナリオは、クエリタイプの場合と同様です。

そのため、これを使用するには、まず自分のクラスをマークする必要があります。 SomeModel[Keyless] データアノテーション、または .HasNoKey() メソッドを呼び出すと、以下のようになります。

public DbSet<SomeModel> SomeModels { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<SomeModel>().HasNoKey();
}

この設定後、説明した方法のいずれかを使用することができます。 ここで を使用してSQLクエリを実行します。例えば、このようなものがあります。

var result = context.SomeModels.FromSqlRaw("SQL SCRIPT").ToList();
var result = await context.SomeModels.FromSql("SQL_SCRIPT").ToListAsync();