2015-12-17 6 views
5

私のプロジェクトの1つをEntity Framework 7(rc1-final)に移行することにしました。私はSQL Serverをターゲットとしており、EntityFramework.MicrosoftSqlServerパッケージもインストールされています。EF7を使用してカスタムSQLクエリを実行することは可能です

DBからオブジェクトを取得するためにカスタムSQLクエリを実行できないような問題が1つあります。 (DbContext.Databaseプロパティを介してアクセスすることができる)

DatabaseFacadeオブジェクトは、(何も返さない)拡張メソッドExecuteSqlCommandを提供するが、それは、オブジェクトをフェッチすることを可能にするSqlQuery<T>方法を提供していません。どちらの方法も古き良きEF 6で利用できましたが、新しいEF 7は最初のものだけを宣言しています。

したがって、SqlQuery<T>メソッドはまだここにあります(ただし移動/名前が変更されました)か、新しいEF実装から完全に削除されましたか?

もちろん、冗長な方法(SqlCommandとそのExecuteReaderメソッドを使用して)を解決することは絶対に可能ですが、私はそれを避けることをお勧めします。

答えて

6

EntityFramework.Relationalは、次の拡張方法を公開しています。

public static IQueryable<TEntity> FromSql<TEntity>(
     [NotNull] this IQueryable<TEntity> source, 
     [NotNull] [NotParameterized] string sql, 
     [NotNull] params object[] parameters) 
     where TEntity : class 

これは可能です。

myDatabaseContext.Customers.FromSql("SELECT * FROM Customers WHERE Name='p0'", "timothy"); 
+3

おかげで、私はすでにその方法を知っている、しかし:あなたのプログラムで は、あなたがこれを行うことができます。私はこのメソッドをDbSet と一緒に使用し、DbContext内で定義する必要があることを理解しています。私のケースは少し異なります - 私は自分のDbContextに存在しないオブジェクトを取得したい(つまり、クエリを実行し、戻された各行に対してタイプTのオブジェクトを作成する)。 –

+0

その場合、[この回答](http://stackoverflow.com/a/34191033/469777)のような基礎となるSqlCommandを使用してください。 –

+0

実際には私は今このアプローチを使用しています(Command + ExecuteReader)。 SqlQueryが見つからないと比較して冗長ですが、それはもちろん動作します。 Btw、お時間をいただきありがとうございました。あなたの答えは間違いなく有用です。ありがとうございます。 –

0

UpメソッドとDownメソッドに渡されるmigrationBuilderオブジェクトでSqlメソッドを使用できるようです。少なくともrc2で。

protected override void Up(MigrationBuilder migrationBuilder) 
{ 
    ... 
    migrationBuilder.Sql("<Sql here>"); 
} 
+1

このメソッド 'migrationBuilder.Sql'は、EF Core RTMバージョンに存在しないようです。誰でも同等のことを知っていますか? – Reza

1

EF7で、カスタマーのSQLクエリを実行するために、あなたはあなたのSQLクエリが返すの構造のような「偽」のテーブル構造を作成することができます。

例:あなたのクエリは次のとおりです。 "A、B a.b_id = b.idからaの化合物。表、b.Bを選択します"。偽のテーブルには、A、Bのような2つの列が含まれます。残念ながらそれは、入力パラメータとしてのIQueryable 必要があり、

var result = myDatabaseContext.FakeTables.FromSql("select a.A, b.B from A,B where a.b_id=b.id"); 
関連する問題