Необработанное исключение при использовании FirstOrDefault () с CollectionViewSource? - PullRequest
1 голос
/ 31 октября 2011

Я связал сущности с CollectionViewSource.Затем я запрашиваю код.Поскольку поле id - это PK, поэтому я думаю, что я должен использовать FirstOrDefault (), чтобы ускорить выполнение моего приложения.Но он всегда выдает исключение ...

XAML:

<Window.Resources>
        <CollectionViewSource x:Key="contractlogoesViewSource" d:DesignSource="{d:DesignInstance my:contractlogo, CreateList=True}" />
    </Window.Resources>
    <Grid>
        <Grid DataContext="{StaticResource contractlogoesViewSource}" HorizontalAlignment="Left" Margin="12,12,0,0" Name="grid1" VerticalAlignment="Top">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
...

Код:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    VBDAdvertisement.vbdadvertisementEntities vbdadvertisementEntities = new VBDAdvertisement.vbdadvertisementEntities();            
    System.Windows.Data.CollectionViewSource contractlogoesViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("contractlogoesViewSource")));
    contractlogoesViewSource.Source = vbdadvertisementEntities.contractlogoes.Where(q => q.id.Equals(3)).FirstOrDefault();
}

Выдает необработанное исключение:

An unhandled exception of type 'System.ArgumentException' occurred in
PresentationFramework.dll
Additional information: 'VBDAdvertisement.customer' is not a valid value for
property 'Source'.

Но когда я опускаю FirstOrDefault () из дерева выражений, например:

contractlogoesViewSource.Source = vbdadvertisementEntities.contractlogoes.Where(q => q.id.Equals(3));

Это работает хорошо!

Так почему FirstOrDefault () вызывает ошибку?
В этом случае, если я буду использовать FirstOrDefault (), будет ли мое приложение работать быстрее, если я использую FirstOrDefault ()?

ps: я создаю форму редактирования, поэтому я просто хочу, чтобы один элемент былзагружен.

1 Ответ

3 голосов
/ 31 октября 2011

Причина, по которой вы получаете ошибку, заключается в том, что вы не можете назначить отдельный элемент для CollectionViewSource.Если это форма редактирования, вам, вероятно, не нужен CollectionViewSource, и вы можете привязать элемент напрямую.

Если вы сделаете это, вы можете использовать FirstorDefault(), чтобы получить первый элемент.Но в вашем случае, так как вы выбираете по идентификатору, я думаю, что лучше использовать SingleOrDefault(), так как он более точно показывает намерение того, что вы хотите, например, так:исключение, если более одного элемента соответствует предикату, но поскольку ID является первичным ключом, это не будет проблемой для вас.

Если вы хотите использовать CollectionViewSource (но я не понимаю, почему), вы можете использовать .Take(), чтобы получить коллекцию, содержащую один элемент, например:

vbdadvertisementEntities.contractlogoes.Where(q => q.id.Equals(3)).Take(1);
...