2012-11-20 4 views
1

저는 RavenDB를 처음 사용 했으므로 Any() LINQ 쿼리가 제대로 작동하도록 노력했습니다. 나는 다음과 같은 쿼리 나에게 "ES-ES"에 대한 번역이없는 모든 항목을 제공하기 위해 기대문제가 발생했습니다! raven db와 함께 작동하는 any() 쿼리

{ 
    "Key": "BKey", 
    "Text": "B Key", 
    "IsLocal": false, 
    "Category": null, 
    "_destroy": false, 
    "Translations": [ 
    { 
     "CultureCode": "es-ES", 
     "Text": null 
    }, 
    { 
    "CultureCode": "ja-JP", 
    "Text": "Hello" 
    } 
    ] 
} 

: 여기처럼 내 문서 모습입니다 그러나

var nonTranslatedEntries = 
_docs.Query<ResourceEntry>().Where(e => e.Translations == null || e.Translations.Count == 0 || !e.Translations.Any(t => t.CultureCode == "es-ES" && t.Text != null)) 

이 ISN 일하고있어. 지정된 CultureCode에 대한 번역이있는 경우에도 항목을 다시 가져옵니다. 번역 배열 안에 하나의 항목 만있는 경우 작동합니다. 그러나 번역 배열 내에 둘 이상의 항목이있는 경우 쿼리가 작동을 멈 춥니 다. 대체 솔루션으로

, 나는 다음을 수행하려고 :

var translatedEntries = from re in _docs.Query<ResourceEntry>() 
            where re.Translations.Any(t => t.CultureCode == cultureCode && t.Text != null) 
            select new {Id = re.Id}; 
var translatedIds = translatedEntries.ToList().Select(e => e.Id).ToList(); 

var nonTranslatedEntries = 
    _docs.Query<ResourceEntry>().Where(e => !e.Id.In(translatedEntryIds)); 

을하지만 그건 그냥 빈 목록을 다시 제공합니다.

도움이 될 것입니다.

감사합니다,

니 자르

+0

실행중인 RavenDB의 버전은 무엇입니까? –

+1

Google 그룹에서 소식을 보았습니다. 버그 인 것 같습니다. 그것은보고되었습니다. http://issues.hibernatingrhinos.com/issue/RavenDB-732 –

답변

1

작업이 완료 얻을 것이다 정적 색인 다음 CultureCodes 목록이되고 있음을

var nonTranslatedEntries = 
    session.Query<Resources_ByTranslation.IndexEntry, Resources_ByTranslation>() 
      .Where(x => x.CultureCodes != "es-ES") 
      .As<ResourceEntry>(); 

참고 :

public class Resources_ByTranslation : 
    AbstractIndexCreationTask<ResourceEntry, Resources_ByTranslation.IndexEntry> 
{ 
    public class IndexEntry 
    { 
     public string Key { get; set; } 
     public string CultureCodes { get; set; } 
    } 

    public Resources_ByTranslation() 
    { 
     Map = entries => from entry in entries 
         select new { 
            entry.Key, 
            CultureCodes = entry.Translations 
                .Where(x => x.Text != null) 
                .Select(x => x.CultureCode) 
            }; 
    } 
} 

은 다음과 쿼리 단일 문자열로 취급됩니다. 이는 인덱스 일치가 내부적으로 어떻게 작동하는지에 기인합니다. 그것은 약간 이상하지만 작동하지 않습니다.

+0

Matt, 올바른 결과를 가져 오지 못합니다. 다음은 Lucene 쿼리가 Intellisense를 통해 본 것입니다. {(-CultureCode : es \ -ES AND CultureCode : *)}. 이 질문에 대한 대답으로 게시 한 다른 방법을 통해이 문제를 해결해야했습니다. 도와 주셔서 다시 한 번 감사드립니다! – Nizar

0

나는 다음과 같이 내 문제를 해결 결국 : 다음

{ 
    "Key": "BKey", 
    "Text": "B Key", 
    "IsLocal": false, 
    "Category": null, 
    "_destroy": false, 
    "Translations": [ 
    { 
     "CultureCode": "es-ES", 
     "Text": null 
    }, 
    { 
    "CultureCode": "ja-JP", 
    "Text": null 
    } 
    ] 
} 

I : 리소스 항목, 내가 가서 모든 가능한 번역을 만들고 null로 번역 텍스트를 설정 생성시

public class ResourceEntries_ByCultureCodes : AbstractIndexCreationTask<ResourceEntry> 
    { 
     public ResourceEntries_ByCultureCodes() 
     { 
      Map = entries => from e in entries 
          select new 
           { 
            e.Id, 
            e.Key, 
            e.Text, 
            e.IsLocal, 
            e.Category, 
            _ = e.Translations.Select(t => CreateField(t.CultureCode, t.Text != null, false, true)) 
           }; 
     } 
} 

나에게 번역은 특정 문화가있는 경우 '사실'로 설정 한 값과 번역의 평평한 기록을 제공 : 다음 인덱스를 만들었습니다. 예를 들어, 내가 다시 이런 걸 얻을 :

_docs.LuceneQuery<ResourceEntry, ResourceEntries_ByCultureCodes>().WhereEquals("es-ES", false); 

는 내가 거기에 소원 :

{ 
    Id, 
    Key, 
    Text, 
    IsLocal, 
    Category, 
    es-ES: <true> or <false> depending upon whether Translation.Text != null 
    ja-JP:<true> or <false> depending upon whether Translation.Text != null 
} 

번역되지 않은 "ES-ES"에 대한 모든 항목을 얻기 위해 다음과 같이 나는 다음 LuceneQuery을 수행 할 수 있습니다 그러나 더 쉬운 해결책이었다.

관련 문제