2009-02-02 4 views
0
나는 그들이이 클래스 설정 2008 년

WPF/LINQ 데이터 계층 설계 질문

C#에서 프로 WPF에서 "데이터 바인딩"장을 통해 일하고 있어요

:

public class StoreDB 
{ 
    public Contact GetContact(int id) {...} 
    public List<Contact> GetContacts() {...} 
} 

아이디어입니다 이 메서드를 호출하여 Contact 또는 List<Contact>을 가져 와서 후자의 메서드에서 LINQ를 사용하여 적절한 컨트롤에 바인딩하여 개체를 필터링/정렬합니다.

이 모든 것이 의미가 있습니다.

그러나 연락처가 100,000 개이고 그 중 3 개를 가져 오려면 어떻게됩니까? GetContacts() 메서드가 100,000이되고 LINQ가 그 중 3 개를 선택합니까?

이렇게 비효율적이지 않습니까?

이것을 피하기 위해 실제 응용 프로그램을 어떻게 구축합니까?

답변

1

Linq 세계에 오신 것을 환영합니다!

IQueryable<Contact> SerachByFirstName(StoreDB store, string searchParam, int limit) 
{ 
    return store.GetContacts() 
     .Where(c => c.FirstName == searchParam) 
     .Take(limit); 
} 

는 사실이 여전히 데이터베이스에 쿼리를 파견하지 않습니다 사이클 또는 대역폭을 낭비하지 않고

이제
public class StoreDB 
{ 
    public Contact GetContact(int id) {...} 

    // change to this: 
    public IQueryable<Contact> GetContacts() {...} 
} 

이 말할 수 :

당신은이 IQueryable<Contact> 반환 할 IQueryable을 통해 enumarting을 시작하지 않는 한. 즉, Where() 또는 OrderBy()을 계속 추가 할 수 있으며 쿼리가 최종적으로 평가 될 때 병합되어 소스에 함께 전송됩니다.


물론 이것은 UI에 바인딩하는 데 도움이되지 않습니다. 그러나 그것은 어려운 문제입니다. 기본 EntitySet을 WPF에 노출 시키거나 MVVM (또는 유사한) 아키텍처를 사용하여 데이터 액세스 및 UI를 분리해야합니다.

+0

그래,이게 내가하고 싶은 일이지만 위의 원인은 "System.Collections.Generic.IEnumerable 유형을 System.Linq.IQueryable 로 변환 할 수 없습니다."라는 것입니다. 목록이 인데, IQueryable 은 추상이기 때문에 작동하지 않기 때문에 무엇을 사용해야합니까? –

+0

내 대답이 향상되었습니다. –

1

당신이 사용하는 책을 모릅니다. 그러나 여기에있는 질문은 LINQ to SQL을 사용하고 VS 디자이너를 통해 프로젝트에 dbml 파일을 추가 할 수 있다면 어떤 데이터베이스를 사용하고 있습니까? Sever Explorer 뷰에서 dbml로 사용하려면 모든 bussness 객체 클래스가 자동으로 생성됩니다.

거기에서 생성 된 dataContex를 사용하고 linq을 사용하여 결과를 가져 오기 전에 필터링 할 수 있습니다.

당신이 지금하고있는 일은 다른 방법으로 가져온 개체를 필터링하는 것입니다.

HTH, 당신은 내가 당신이 정말로 WPF 및 LINQ 또는 ADO.net에 대한 좋은 VIDO의 교육 사진에서 살펴 봐야 할 것이라고 생각 월 WPF 및 LINQ의 quetions을 요구 한 이후 에릭

2

나는 목록 <T>을 반환 GetContacts이없는 않는 디자인을 추천 할 것입니다. 반환하려는 컬렉션이 변경 가능하기 때문에 List <T>을 사용하고 싶지는 않습니다. WPF에서 변경 가능한 항목 목록을 좋아한다면 ObservableCollection <T>을 사용해보십시오.

그러나 최상의 인터페이스는 SQL 또는 LINQ 쿼리의 결과 인 IEnumerable <T>을 반환한다고 생각합니다. 이렇게하면 LINQ to Objects로 간단하고 쉽게 필터링 할 수있는 바인더에 대한 연락처 불변 콜렉션이 제공됩니다.

+0

IEnumerable 이 데이터를 한 번에 모두 반환합니까? 아니면 IQueryable 처럼 작동하고 액세스 할 때 데이터 만 처리합니까? –

+0

IEnumerable 데이터 액세스는 구현을 기반으로합니다. 지연 될 수도 있고 즉각적 일 수도 있습니다. – user7116