Wpf 对CollectionViewSource使用FirstOrDefault()时出现未处理的异常?

Wpf 对CollectionViewSource使用FirstOrDefault()时出现未处理的异常?,wpf,entity-framework-4,collectionviewsource,Wpf,Entity Framework 4,Collectionviewsource,我将实体绑定到CollectionViewSource。然后我查询代码隐藏。因为id字段是PK,所以我认为应该使用FirstOrDefault()使我的应用程序执行得更快。但它总是抛出一个异常 XAML: <Window.Resources> <CollectionViewSource x:Key="contractlogoesViewSource" d:DesignSource="{d:DesignInstance my:contractlogo, Creat

我将实体绑定到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>
...
它引发未处理的异常:

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(),我的应用程序会执行得更快吗


ps:我正在设计一个编辑表单,因此我只希望加载单个项目。

出现错误的原因是无法将单个项目分配给CollectionViewSource。如果是编辑表单,则可能不需要CollectionViewSource,可以直接绑定到该项

如果执行此操作,则可以使用
FirstorDefault()
获取第一项。但在您的情况下,由于您是通过ID进行选择的,因此我认为最好使用
SingleOrDefault()
,因为它更准确地显示了您想要的内容的意图,如下所示:

contractlogoesViewSource.Source = vbdadvertisementEntities.contractlogoes.SingleOrDefault(q => q.id.Equals(3));
vbdadvertisementEntities.contractlogoes.Where(q => q.id.Equals(3)).Take(1);
SingleOrDefault()
如果有多个项与谓词匹配,则会引发异常,但由于ID是主键,因此不会对您造成问题

如果要使用CollectionViewSource(但我不知道为什么),可以使用
.Take()
获取包含单个项的集合,如下所示:

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

嗨,雷,id字段是主键,所以它也是唯一的。我在某个地方读到,如果我们确定只返回1条记录,那么使用FirstOrDefault()将加快查询速度。在winform中,我在绑定源代码时使用FirstOrDefault(),没有问题,但wpf没有。这是一个编辑表单,所以我只需要加载一个项目。@Sun,我更新了我的答案,让您更清楚地了解情况。