gpt4 book ai didi

c# - 使用 RavenDB 和 LINQ 从子集中查找至少包含一个元素的对象

转载 作者:行者123 更新时间:2023-11-30 18:39:21 24 4
gpt4 key购买 nike

我有简单的类型问题:

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"};

我希望返回 q1q2q3q4。我用来获得所需结果的查询是:

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 以获取带有与您的标签数组数组匹配的标签的问题,如下所示:

string[] tags = new[] { "a", "b" };
string queryRange = "(" + string.Join(" OR ", tags) + ")";

var res = session.Advanced.LuceneQuery<Question>()
.Where("Tags:" + queryRange).ToList();

请注意,这会查询整个索引问题,而不是子集。但我认为您可以将 - 我猜 - 附加到查询字符串表达式。有关此类查询的更多信息,请参阅 Lucene 文档: http://lucene.apache.org/core/old_versioned_docs/versions/3_0_0/queryparsersyntax.html

关于c# - 使用 RavenDB 和 LINQ 从子集中查找至少包含一个元素的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10137547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com