0

EntityDataSource を使用しています。「Select」プロパティを空白のままにすると、すべてがうまく機能します.SomeWebControl_DataBindingでは、GridRowのDataItemをエンティティに完全に変換できます(USERSと呼びましょう)。

Literal ctrlTime = (Literal)sender;
GridViewRow row = (GridViewRow)ctrlTime.NamingContainer;
USERS usersRow = (USERS)row.DataItem;
DateTime timestamp = usersRow.Time;

ただし、テーブルの最初の 1000 行のみを表示する必要があるため、EntityDataSource の "Select" プロパティを入力し、それを "TOP(1000) |エンティティ内のすべてのフィールドのリスト|" に設定します。でもそれをしたらすぐに

    USERS usersRow = (USERS)row.DataItem;

惨めに失敗し、MaterializedDataRecord から USERS に変換できないことがわかりました。

私がやったことはこれです:

Literal ctrlTime = (Literal)sender;
GridViewRow row = (GridViewRow)ctrlTime.NamingContainer;
DbDataRecord usersRow = (DbDataRecord)row.DataItem;
DateTime timestamp = (DateTime)usersRow["Time"];

おそらく (DbDataRecord) の代わりに (MaterializedDataRecord) を使用できますが、同僚を怖がらせたくありませんでした。さて、これは機能しますが、見苦しく、EntityFramework を使用することの美しさを台無しにしています。また、これは非常に基本的な例です。将来、他の多くのフィールドをボックス化/ボックス化解除する必要がある同様の状況に直面する可能性がありますが、これは見栄えがよくありません。

だから私の質問は、MaterializedDataRecord をエンティティに簡単に変換する方法や、EntityDataSource を設定して、エンティティの代わりに MaterializedDataRecord を作成する「脅威」として「選択」に何かが存在することを考慮しない方法はありますか?

エンティティのフィールドのサブセットを選択している場合はその動作を理解できるということですが、ここではすべてのフィールドを選択しているため、EntityDataSource を変換しても問題はありません。

ありがとう!

4

1 に答える 1

0

ここでわかるように、Linq to Entities vs ESQL のパフォーマンス を見ると、EntityDataSource は ESQL を使用してクエリを作成しているように見えます。次に、「選択」プロパティを使用すると、投影が変更され、モデルエンティティを使用できなくなります。

できることは、QueryCreated イベントを使用して、クエリを変更して実行する前に上位 1000 件のレコードをフィルター処理することです。http://msdn.microsoft.com/en-us/library/ee404748.aspxに例があります。

于 2014-04-24T18:37:44.750 に答える