1

エンティティを 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 : 編集フォームを設計しているので、単一のアイテムをロードしたいだけです。

4

1 に答える 1

3

エラーが発生する理由は、CollectionViewSourceに単一のアイテムを割り当てることができないためです。編集フォームの場合は、おそらくCollectionViewSourceは必要なく、アイテムに直接バインドできます。

これを行うFirstorDefault()と、最初のアイテムを取得するために使用できます。しかし、あなたの場合、IDで選択するSingleOrDefault()ので、次のように、必要なものの意図をより正確に示すため、使用する方が良いと思います。

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

SingleOrDefault()複数の項目が述語に一致する場合は例外をスローしますが、IDは主キーであるため、問題にはなりません。

CollectionViewSourceを使用する場合(ただし、理由はわかりません)、次.Take()のように、単一のアイテムを含むコレクションを取得するために使用できます。

vbdadvertisementEntities.contractlogoes.Where(q => q.id.Equals(3)).Take(1);
于 2011-10-31T10:36:12.187 に答える