0

エンティティ フレームワークからデバッグ用のパラメーターを含むクエリ文字列を取得しようとしています。いいえ、EFProfiler は使用しません。クエリ文字列を出力としてページに表示する必要があるからです。これらのクエリのほとんどは、ExecuteStoredQuery() を使用して手動で作成されます。ただし、それらを ObjectQuery にキャストすると null が生成されます。

例:

ObjectResult<Parent> model = _context.ObjectContext().ExecuteStoreQuery<Parent>("SELECT * FROM Parents");
var objectQuery = model.AsQueryable() as ObjectQuery<Parent>;

objectQuery がヌルです。ObjectContext() は、次のような datacontext の単純なメソッドです。

return (this as IObjectContextAdapter).ObjectContext;

私は自分のアイデアを使い果たしましたが、検索から返されたものはすべて...まあ、役に立たない.誰もその問題を解決していないようです. 結果はクエリから正しく返されます。

編集:そうですね、これについても言及すべきでした。

これを行う:

var oq = m as ObjectQuery<Parent>;

私にこれをもたらします:

参照変換、ボックス化変換、ボックス化解除変換、ラッピング変換、または null 型変換を介して、型 'System.Data.Objects.ObjectResult' を 'System.Data.Objects.ObjectQuery' に変換できません

AsQueryable() をキャストする必要があると思ったのは、明らかな理由から、これは... null です。この小さなディテールを追加するのを忘れたのは私の疲れた頭でした。

4

3 に答える 3

1

ObjectResult<T>他の回答で、 anを an にキャストできないことが明らかになったと思いますObjectQuery<T>。しかし、私はあなたのコメントに興味があります

CreateQuery を試してみましたが、問題が発生しました。1 つは、ユーザーが SELECT * を実行しようとしたときに気に入らないことです。取得する必要があるすべてのフィールドを指定する必要があるようです。

を使用ObjectQueryして「*」検索を実行できます。

ObjectContext().ObjectQuery<Parent>("SELECT VALUE par FROM Parents AS par")

ご覧のとおり、クエリ文字列には actual がなく*、トレース文字列には a がありませんが、*すべてのフィールドが表示されます。ただし、クエリ文字列を作成するためにすべてのフィールドを指定する必要はありません。をより有効にご利用いただくための参考になれば幸いですObjectQuery

于 2013-02-06T21:21:17.973 に答える
0

確かに、実際にはExecuteStoreQuery(sql)ではなくCreateQuery(sql)を使用したいと考えています。

名前を指定すると、ExecuteStoreQueryは実際にSQLを実行し、CreateQueryはデータベースに送信する準備ができているObjectQueryを返します。

明らかに、ObjectQueryでExecuteを呼び出して、ObjectResultを返すことができます。

于 2013-02-06T18:32:55.790 に答える
0

あなたのキャストas ObjectQuery<Parent>は正しくありません。原因は型ではないObjectResult<Parent>.AsQueryable()an を返します。IQueryable<Parent>ObjectQuery<Parent>

AsQueryable は、IEnumerable を IQueryable に変換するクラスQueryableの拡張メソッドです。

その結果、変数 objectQuery は null になります。

于 2013-02-06T14:07:19.743 に答える