我有简单的类型Question
:
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 检索查询结果。
如何改善?