2010-08-13 4 views
1

나는 이것에 문제가있는 것 같다. 태그 테이블과 외래 키 제약 조건이 작업 테이블에있는 Tag 테이블과 ID가있는 Task 테이블이 있습니다.linq에서 제공된 모든 태그로 태그가 지정된 항목을 검색하려면 어떻게합니까?

태그로 작업을 검색하고 검색 할 수 있기를 원합니다. 예를 들어 "이식성"과 "테스팅"이라는 태그가있는 작업을 검색하는 경우 "이식성"이 아닌 "테스트"태그가 붙은 작업은 원하지 않습니다.

var tasks = (from t in _context.KnowledgeBaseTasks 
        where t.KnowledgeBaseTaskTags.Any(x => tags.Contains(x.tag)) 
        select KnowledgeBaseTaskViewModel.ConvertFromEntity(t) 
        ).ToList(); 

이 물론 않는 OR 검색이 아닌 AND 검색 :

나는 다음 구문을 시도했다. 실제로 이것을 AND 검색으로 전환하는 방법을 알 수 없습니다.

편집 또한 작업에 포함 된 2 개의 X 태그 중에서 검색 할 수 있어야합니다. 따라서 "bugfix", "portability", "testing"태그가 붙은 "testing"및 "portability"를 검색하면 해당 작업이 계속 표시됩니다.

답변

2

당신은 LinqToSql의 모양에 this

하고 싶어. 생성 된 SQL을 확인하십시오.

+0

이 작업은 완벽하게 작동했습니다 (하위 쿼리에 ToList()를 추가하고 주 쿼리에 Select() 호출을 추가해야했지만 그렇지 않으면 작동했습니다. – KallDrexx

3

모두 대신 Any를 사용하십시오. 그리고 KnowledgeBaseTasks만을 선택하기 위해서, 그것은 모든 tags을 가지고 있습니다. 식을 역 :이 테스트를하지 않은 별개의 비트가 조금 떨어져있을

List<int> myTags = GetTagIds(); 
int tagCount = myTags.Count; 

IQueryable<int> subquery = 
    from tag in myDC.Tags 
    where myTags.Contains(tag.TagId) 
    group tag.TagId by tag.ContentId into g 
    where g.Distinct().Count() == tagCount 
    select g.Key; 

IQueryable<Content> query = myDC.Contents 
    .Where(c => subQuery.Contains(c.ContentId)); 

:

var tasks = (from t in _context.KnowledgeBaseTasks 
       where tags.All(tag => t.KnowledgeBaseTaskTags.Contains(tag)) 
       select KnowledgeBaseTaskViewModel.ConvertFromEntity(t) 
       ).ToList(); 
+0

미안하지만 분명히해야합니다. All의 문제점은 내 작업에도 "bugfix"태그가있는 경우 "이식성"및 "테스트"태그를 검색하면 해당 태그가 표시되지 않습니다. – KallDrexx

+0

@KallDrexx, 수정 된 답변 참조. – driis

+0

유일한 문제는 KnowledgeBaseTag 엔티티가 문자열이 아닌 전달되도록 기대하기 때문에 KnowledgeBaseTags에 .Contains (string)을 할 수 없다는 것입니다. 나는'exceptions.All (tag => t.KnowledgeBaseTaskTags.Any (entity => entity.tag == 태그))'를 사용하여 시도했지만 예외를 제공합니다 (지역 시퀀스는 LINQ to SQL의 쿼리 연산자의 SQL 구현에서 사용할 수 없습니다. Contains 연산자) – KallDrexx

관련 문제