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 回答