MSDNでは、次の情報を読むことができます。
コントロールを ObjectQuery に直接バインドしないことをお勧めします。代わりに、コントロールを Execute メソッドの結果にバインドします。この方法でバインドすると、バインド中にクエリが複数回実行されるのを防ぐことができます。
と
LINQ クエリを使用する場合は、クエリの結果を ObjectQuery にキャストし、Execute メソッドを呼び出すことをお勧めします。
私の質問は次のとおりです: LINQ to Entity (最大で IQueryable) の結果を、より具体的な型である ObjectQuery にキャストするのは正しいですか??
コントロールを LINQ クエリの結果にバインドする必要がある場合に使用する正しいパターンですか?
Visual Studio 2010 の [データ ソース] ウィンドウから WPF フォームにデータ ソースをドラッグすると、MSDN で説明されているように 2 つのメソッドが生成されますが、アプリケーションでは "predefinedTokensQuery" 変数にフィルターを適用する必要があるため、 LINQ クエリ (生成された "predefinedTokensQuery" 変数の初期化を置き換える) を実行すると、コンパイラは LINQ クエリを ObjectQuery に明示的にキャストできないため、不平を言います。
次のコードは、私のアプリケーションで現在どのように機能しているかを示していますが、ここで何かを見落としていて、推奨されるパターンに従っていないのではないかと本当に心配しています。
private System.Data.Objects.ObjectQuery<Token> GetPredefinedTokensQuery(UnduplicateModelContainer unduplicateModelContainer)
{
// Auto generated code
System.Data.Objects.ObjectQuery<Unduplicate.Token> predefinedTokensQuery = (System.Data.Objects.ObjectQuery<Unduplicate.Token>)
from token in unduplicateModelContainer.Tokens
where token.Predefined == true
select token;
// To explicitly load data, you may need to add Include methods like below:
// predefinedTokensQuery = predefinedTokensQuery.Include("Tokens.Type").
// For more information, please see http://go.microsoft.com/fwlink/?LinkId=157380
// Returns an ObjectQuery.
return predefinedTokensQuery;
}
private void windowPredefinedTokens_Loaded(object sender, RoutedEventArgs e)
{
Unduplicate.UnduplicateModelContainer unduplicateModelContainer = new Unduplicate.UnduplicateModelContainer();
// Load data into Tokens. You can modify this code as needed.
System.Windows.Data.CollectionViewSource predefinedTokensViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("predefinedTokensViewSource")));
System.Data.Objects.ObjectQuery<Unduplicate.Token> predefinedTokensQuery = this.GetPredefinedTokensQuery(unduplicateModelContainer);
predefinedTokensViewSource.Source = predefinedTokensQuery.Execute(System.Data.Objects.MergeOption.AppendOnly);
}
ありがとうございます。フランク・アベル