2012-04-04 2 views
2

문자열 배열을 매개 변수로 사용하고 문자열 컬렉션 인 컬렉션 속성에 대해 쿼리하는 메서드가 있습니다. 해당 속성에 매개 변수로 전달 된 문자열 배열 안에있는 값 중 하나가 있으면 반환해야합니다. 여기 컬렉션 매개 변수가있는 컬렉션 속성에 대한 Linq 쿼리

내 코드입니다 :

public IEnumerable<BlogPost> GetAll(string[] tags, 
    bool includeUnapprovedEntries = false) { 

    foreach (var tag in tags) { 
     foreach (var blogPost in GetAll(includeUnapprovedEntries). 
      ToList().Where(x => x.Tags.Any(t => t == tag))) { 
      yield return blogPost; 
     } 
    } 
} 

참고 : 여기에

는 전체 코드입니다 : '

https://github.com/tugberkugurlu/MvcBloggy/blob/master/src/MvcBloggy.Data/DataAccess/SqlServer/BlogPostRepository.cs

이는 일을하지만, 그것은 단지 아무튼 맞는 것 같습니다. 일부 확장 메서드를 사용하면이 기능을 향상시킬 수 있었지만 트릭을 수행하고 구현을 올바르게 수행 할 수 없었습니다.

아이디어가 있으십니까? 이것에 대해

답변

4

방법 :

public IEnumerable<BlogPost> GetAll(string[] tags, 
    bool includeUnapprovedEntries = false) { 

    return GetAll(includeUnapprovedEntries) 
     .Where(x => x.Tags.Any(t => tags.Contains(t)); 
} 

당신은 결과를 구체화 ToList()를 호출 할 수 있습니다. 이것은 (잘하면!) SQL에서 IN 쿼리가 발생합니다; 많은 수의 태그가있는 경우 태그가 실패하면 놀라지 않을 것입니다. (Entity Framework가 어떻게 그 상황을 처리하는지 모르겠습니다.) 태그 수가 적 으면 좋겠다고 생각합니다.

이 버전이 지원되는지 여부는 일 수 있습니다.은 사용중인 엔티티 프레임 워크의 버전에 따라 달라집니다. 나는 (로컬 컬렉션에서 Contains을 사용하여) SQL에서 IN으로 변환하는 것과 같은 일부 변환이 시간이 지남에 따라 향상되었음을 기억합니다. 당신이 배포 할 동일한 버전에 맞춰 개발했는지 확인하십시오.

+1

아, 지금은 너무 기분이 좋지 않습니다. 더 이상 오전 1시 이후에 코딩하면 안된다. 감사! – tugberk

+0

@tugberk : 실제로 * 작동 *했는지 확인 했습니까? 시도 할 때까지 그것을 가정하지 마십시오 :) LINQ to Objects가 어떻게 동작 할 것인지 예측하는 것이 합리적입니다.하지만 Entity Framework에서 거의 경험이 없습니다 (본질적으로 nil). –

+0

또한이 쿼리는 실제로 SQL Server에 전달되지 않는다고 언급해야합니다. 세미콜론으로 구분 된 문자열 위에 태그 콜렉션을 만들었습니다 (https://github.com/tugberkugurlu/MvcBloggy/blob/master/src/MvcBloggy.Data/DataAccess/SqlServer/Model/BlogPost.cs). 그래서 GetAll을 사용하여 전체 데이터를 가져옵니다 (예, 정말 나쁜 접근이지만 다른 방법을 찾아 낼 수 없었습니다). 그래서, 대부분 Linq to Objetcs입니다. – tugberk