2010-03-02 3 views
1

웹 서비스에서 모든 카테고리를 선택하고 싶습니다. webservice에는 메서드가 없으므로 모든 제품을 가져온 다음이 제품이있는 모든 범주를 선택해야합니다. 웹 서비스에서 데이터를 수신하면 WebServiceProduct (ID, Name 등) 및 WebServiceCategory (ID, 이름 등) 객체를 가져올 수 있습니다.클래스, 익명 유형 및 SelectListItem의 Distinct()

 IQueryable<SelectListItem> categories = (from p in webserviceProductRepository.GetProducts() 
               from c in p.Categories 
               select new SelectListItem 
               { 
                Value = c.ID.ToString(), 
                Text = c.Name 
               }).Distinct().OrderBy(c => c.Text); 

을하지만 먼저 anonymus 유형으로 선택 할 때 작동 :

이 작동하지 않습니다

 var foo = (from p in webserviceProductRepository.GetProducts() 
        from c in p.Categories 
        select new 
        { 
         ID = c.ID.ToString(), 
         Name = c.Name 
        }).Distinct().OrderBy(c => c.Name); 

     IQueryable<SelectListItem> categories = from c in foo 
               select new SelectListItem 
               { 
                Value = c.ID.ToString(), 
                Text = c.Name 
               }; 

나는 또한 확인하기 위해 IEqualityComparer 및 오버라이드 같음과 GetHashCode으로 시도 WebServiceCategory.ID에 있지만 작동하지 않습니다.

내 질문에 왜 Distinct()는 WebServiceCategory 개체 및 SelectListItem보다 익명 형식에서 더 잘 작동합니까?

+0

"... 작동하지 않습니까?" –

+0

별개의 WebServiceCategories가 아니라 모든 WebServiceCategories를 반환합니다. –

답변

2

익명 유형은 값이 동일합니다. 참조 유형은 참조 평등을가집니다. LINQ to Entities는 형식에 대한 기본 의미를 따르고 있습니다. 그러나 Equals을 무시하거나 IEquatable을 구현하면 LINQ to Entities 쿼리가 SQL로 변환되고 LINQ to Entities가 임의 C# 코드를 SQL로 변환 할 수 없으므로 작동하지 않습니다. 예를 들어, Distinct의 과부하는 비교 자 aren't supported in L2E을 취한다.

두 번째 코드 예에서는 한 가지 해결 방법이 이미 있습니다. 익명 유형별로 그룹화하는 방법도 있습니다.

var categories = from p in webserviceProductRepository.GetProducts() 
       from c in p.Categories 
       group c by new { Id = c.ID, Name = c.Name } into g 
       order by g.Key.Name 
       select new SelectListItem 
       { 
        Value = g.Key.Id.ToString(), 
        Text = g.Key.Name 
       }; 
0

SelectListItemIEquatable<T>을 구현해 보셨습니까?

+0

아니요, 나중에 시도 할 것입니다. –

0

나는이 객체에 대해 IQueryable 객체와 IEqualityComparer가 작동하지 않는다고 생각합니다. 어쩌면 도움이 될 것입니다.

IQueryable<SelectListItem> categories = (from p in webserviceProductRepository.GetProducts() 
             from c in p.Categories.Distinct() 
             orderby c.Name 
             select new SelectListItem 
             { 
              Value = c.ID.ToString(), 
              Text = c.Name 
             }); 
+0

이미 시도했지만 작동하지 않습니다. –

+0

웹 서비스 - 또는 저장소가이 코드를 통해 별개의 값을 가지지 않는다면 생각합니다. 고유 한 값을 사용하여 값을 메모리로 가져와야합니다. 익명 유형을 사용할 때 'foo'유형은 무엇입니까? – cem