Какой шаблон рекомендуется использовать для привязки элемента управления WPF к запросу LINQ to Entity? - PullRequest
1 голос
/ 23 января 2011

На MSDN вы можете прочитать следующее:

Мы рекомендуем не связывать элементы управления напрямую с ObjectQuery.Вместо этого свяжите элементы управления с результатом метода Execute.Привязка таким образом предотвращает многократное выполнение запроса во время привязки.

и

Если вы предпочитаете работать с запросами LINQ, мы рекомендуем вам привести результатзапроса к ObjectQuery и вызовите метод Execute.

Мой вопрос: Правильно ли привести результат LINQ to Entity (который является не более чем IQueryable) к ObjectQuery, более конкретнотип ??

Правильно ли использовать этот шаблон, когда необходимо привязать элемент управления к результату запроса LINQ?

Когда я перетаскиваю источник данных из окон источников данных Visual Studio 2010к моей форме WPF генерируются два метода, как объяснено в MSDN, но в моем приложении мне нужно применить фильтр к переменной "предопределенный токен", и поэтому я написал запрос LINQ (заменив сгенерированную инициализацию переменной "предопределенный токен")), а затем компилятор жалуется, потому что он не может явным образом привести запрос LINQ к ObjectQuery.

foсейчас я использую код, который работает в моем приложении, он работает, но я действительно боюсь пропустить что-то здесь и не следовать рекомендованному шаблону.

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);
}

Спасибо заранее.Фрэнк Абель

...