2010-04-07 3 views
4

이 두 시나리오 간의 성능 차이와 단점이 서로 어떻게 될지 궁금합니다.IQueryable 또는 열거 형 개체 반환

첫 번째 시나리오 :

public class Helper //returns IQueryable 
{ 
    public IQueryable<Customer> CurrentCustomer 
    { 
     get{return new DataContext().Where(t=>t.CustomerId == 1); 
    } 
} 

public class SomeClass 
{ 
    public void Main() 
    { 
     Console.WriteLine(new Helper().CurrentCustomer.First().Name; 
    } 
} 

두 번째 시나리오 : 사전에

public class Helper //returns Enumerated result 
{ 
    public Customer CurrentCustomer 
    { 
     get{return new DataContext().First(t=>t.CustomerId == 1); 
    } 
} 

public class SomeClass 
{ 
    public void Main() 
    { 
     Console.WriteLine(new Helper().CurrentCustomer.Name; 
    } 
} 

감사합니다.

답변

4

글쎄요, 내가 볼 수있는 가장 큰 차이점은 쿼리가 실행될 때와 쿼리로 수행 할 수있는 다른 작업입니다.

예를 들어, Customer 개체에 큰 필드가 있다고 가정합니다. 두 번째 방법을 사용하면 항상 가져옵니다. 첫 번째 방법을 사용하면 쓰기 : 만 데이터베이스에 하나의 필드를 조회 할 필요가

string name = helper.CurrentCustomer.Select(x => x.Name).First(); 

. 타이밍면에서 쿼리는 실제로 데이터를 요청할 때만 실행됩니다 (위의 경우 쿼리를 넣을 때까지 Select을 사용하기 전까지 기다릴 수있는 방법입니다). 장단점이 있습니다. 추론하기가 더 어려워 질 수 있지만, 일부 작업도 줄일 수 있습니다. "추론"측면에서 고객이 생기면 작업 할 수있는 객체가 있다는 것을 알 수 있습니다. 두 번 생각 같은 쿼리 가능을 사용하는 경우, 당신은 당신이 쓰는 경우 ... 당신의 LINQ 쿼리 공급자가 결과를 캐시하는 것입니다 여부를 알아야합니다

IQueryable<Customer> currentCustomerQuery = helper.CurrentCustomer; 
Customer x = currentCustomerQuery.First(); 
Customer y = currentCustomerQuery.First(); 

그 문제 쿼리 한 번 또는 두 번 것인가? 나는 그것이 제공자에 달려 있다고 생각하지만, 특정 제공자에 대해서는 추측을하고 싶지 않습니다.

또 다른 고려해야 할 점은 건물중인 API를 사용하는 것이 얼마나 쉬운 지입니다. 개인적으로 나는 보통 데이터를 가져올 수있는 쿼리가 아니라 원하는 데이터를 제공하는 API를 사용하는 것이 더 쉽다고 생각합니다. 한편, 은 약간 유연하지 않은입니다.

하나의 옵션은 모두 - GetCurrentCustomerQuery() 및 GetCurrentCustomer() 메소드를 가질 수있게하는 것입니다. (아마 개인적으로 속성을 만들지는 않겠지 만 개인적인 취향의 문제 일뿐입니다.) 그렇게하면 실제로 필요할 때 원하는 유연성을 얻을 수 있지만 현재 고객을 개체로 가져 오는 간단한 방법이 있습니다. .

+0

왜 속성을 만들지 않는지 설명 할 수 있습니까? 감사. – Tarik

+0

@Tarik : 적어도 실제로 데이터베이스 쿼리를 수행하는 경우 속성이 너무 많은 작업을 수행하는 것처럼 느껴집니다. 나는 일반적으로 부동산 취득자가 많은 일을 할 것으로 기대하지 않습니다. 다른 한편으로, 많은 LINQ가 쿼리를 만드는 속성을 가지고 작동한다고 생각합니다. 그래서 그것과 잘 맞을 것입니다. 그것은 정말 개인적인 취향이지만. –

+0

좋습니다 덕분에. – Tarik

0

즉, IQueryable을 사용하면 실제로 개체 나 컬렉션을 메모리에로드하지 않고 경로를 따라 반환 된 IQueryable을 훨씬 더 필터링 할 수 있습니다. 이 경우 반환 유형은 간단한 Customer 클래스이고 영향은 미미하지만 컬렉션의 경우 IQueryable을 사용하는 것이 좋습니다. Chris Sells가 문제를 더 자세히 보여줍니다. here

0

두 메서드의 차이점은 첫 번째 개체가 개체를 반환 할 수있는 식을 반환하고 두 번째 개체가 이미 식을 실행하고 개체를 반환한다는 것입니다.

이 정확한 시나리오에서 차이점은별로 유용하지 않으며 단일 개체를 표현식으로 반환하는 것은 그리 직관적이지 않습니다.

차이점이 더 유용한 시나리오는 여러 개체를 반환하는 메서드가있는 경우입니다. 표현식의 지연된 실행은 실제로 사용하는 오브젝트 만로드한다는 것을 의미합니다. 처음 몇 개의 객체 만 필요로하는 경우 나머지 객체는 생성되지 않습니다.