2011-10-31 3 views
1

엔티티를 CollectionViewSource에 바인딩했습니다. 그런 다음 코드 뒤에 쿼리합니다. ID 필드는 PK이므로 FirstOrDefault()를 사용하여 내 앱을 더 빠르게 실행해야한다고 생각합니다. 그러나 항상 예외가 발생합니다 ...FirstOrDefault()를 CollectionViewSource와 함께 사용할 때 처리되지 않은 예외가 있습니까?

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 : 편집 양식을 디자인 중이므로 하나의 항목 만로드하고 싶습니다.

답변

3

오류가 발생하는 이유는 하나의 항목을 CollectionViewSource에 할당 할 수 없기 때문입니다. 편집 양식 인 경우에는 CollectionViewSource가 필요하지 않고 항목에 직접 바인딩 할 수 있습니다.

이렇게하면 FirstorDefault()을 사용하여 첫 번째 항목을 가져올 수 있습니다. 하나 개 이상의 항목을 경우

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

SingleOrDefault()이 예외가 발생합니다 :하지만 ID하여 선택 이후 귀하의 경우에, 나는 그것이 더 정확하게과 같이 당신이 원하는 의도를 보여줍니다 이후는 SingleOrDefault()을 사용하는 것이 더 좋다고 생각한다 는 술어와 일치하지만 ID는 기본 키이므로 문제가되지 않습니다. 당신이 (왜하지만 난 볼 수 있음) CollectionViewSource를 사용하려면

, 당신과 같이, 단일 항목을 포함한 컬렉션을 얻을 수 .Take()를 사용할 수 있습니다

vbdadvertisementEntities.contractlogoes.Where(q => q.id.Equals(3)).Take(1); 
+0

안녕 레이, id 필드는 기본 키이므로 고유합니다. FirstOrDefault()를 사용하면 어딘가에 하나의 레코드가 반환 될 것이라는 확신이들 경우 쿼리가 더 빨라질 것입니다. winform에서 나는 문제없이 바인딩 소스와 함께 FirstOrDefault()를 사용하지만 wpf는 그렇지 않습니다. – JatSing

+0

그리고 이것은 편집 폼이므로 하나의 항목 만로드하면됩니다. – JatSing

+0

@Sun, 나는 상황을 좀 더 분명하게하기 위해 나의 대답을 업데이트했다. – Ray