将FirstOrDefault()与CollectionViewSource一起使用时出现未处理的异常?

时间:2011-10-31 10:24:47

标签: wpf entity-framework-4 collectionviewsource

我将实体绑定到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 个答案:

答案 0 :(得分: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);