我将实体绑定到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:我正在设计一个编辑表单,所以我只想加载一个项目。
答案 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);