子集的至少一個元素查找對象我有簡單類型Question
:其中包含使用RavenDB和LINQ
public class Question
{
public Question(string id)
{
Id = id;
Tags = new List<string>();
}
public string Id { get; private set; }
public IList<string> Tags { get; set; }
}
我已經定義了這樣的問題,標本採集:
var q1 = new Question("q1") { Tags = new List<string>() {"a"} };
var q2 = new Question("q2") { Tags = new List<string>() {"b"} };
var q3 = new Question("q3") { Tags = new List<string>() {"a", "b", "c"} };
var q4 = new Question("q4") { Tags = new List<string>() {"a", "b"} };
var q5 = new Question("q5") { Tags = new List<string>() {"z"} };
var q6 = new Question("q6");
var questions = new List<Question>() {q1, q2, q3, q4, q5, q6};
現在我需要找到所有問題,其中至少包含一個標記,來自給定子集。子集定義如下:
string[] tags = new[] {"a", "b"};
我希望Q1,Q2,Q3和Q4歸還。我用它來獲得期望的結果的查詢是:
var questions = DocumentSession.Query<Question>().AsQueryable();
questions = GetQuestionsToContainingAtLeastOneTagFromSubset(questions, tags)
// some other query restrictions
var result = questions.ToList(); // (**)
其假設強加給我的集合限制的功能如下:
private IQueryable<Question> GetQuestionsToContainingAtLeastOneTagFromSubset(IQueryable<Question> questions, IEnumerable<string> tags)
{
var result = new List<Question>();
foreach (var tag in tags)
{
var currentTag = tag;
var resultForTag = questions.Where(x => x.Tags.Any(xTag => xTag == currentTag));
result = result.Concat(resultForTag).ToList();
}
return result.GroupBy(x => x.Id).Select(grp => grp.First()).AsQueryable();
}
我覺得這是非常低效的。我想避免在提供的功能中使用.ToList()
。據我所知這.ToList()
表達式查詢RavenDB並返回部分結果(順便說一句:我是吧?)。這不是有效的。我只想對所提供的功能施加限制,並在施加所有限制後執行查詢。 (**)
的地方對我來說是很好的把批處理髮送到RavenDB檢索查詢結果。
如何改善?
感謝您的提示。我改變了我的問題中的數據,只是因爲我想向您顯示這不符合預期。調試器中的Lucene查詢轉換爲{Tags:a或b},並且由於某種原因它僅返回q1,q3和q4。它假設也返回q2,但它不。此外,我想在這個特定的例子中避免使用LuceneQuery。 – jwaliszko 2012-04-13 13:48:28
試試這個查詢範圍: string queryRange =「(」+ string.Join(「OR」,tags)+「)」;我更新了我的答案。至於沒有使用明確的lucene查詢...我更喜歡linq查詢,但如果lucene提供和ravendb公開,爲什麼不使用它? :)這很簡單 – 2012-04-13 14:45:55
謝謝,它現在有效。這看起來確實很簡單。我想避免Lucene查詢,因爲我考慮過構建連續的限制。雖然我已經添加了一些限制的IQueryable集合,但我無法進一步應用Lucene限制。從Raven.Client.IDocumentSession獲得構建Lucene查詢的權限,我很樂意應用相同的restristions,但在Linq中使用IQueryable。 – jwaliszko 2012-04-13 16:13:04