3

我有一个简单的 Raven dB 表,如下所示:

char[] colorArray= colorValue.ToCharArray().Distinct().ToArray();

for loop{
var entity = new Color { ID = id, colorArray = colorArray };
session.Store(entity);
}
Session.Savechanges();

此表包含 1000 条或更多记录。


现在用户输入一个数组:

char[] userinput=userinput.tocharArray().Distinct().ToArray();

假设用户的数组由字符“r”、“e”和“d”组成。我需要列出由所有用户输入的字符组成的所有记录(即输出记录需要有'r'、'e'和'd'字符)。

我尝试了不同的技术,包括:

.Where(x=>x. colorArray.Intersect(userinput).Count()==userinput.count())

但不起作用,出现以下错误:无法理解如何翻译 x.subsetArray.Intersect...</p>

4

1 回答 1

2

不允许使用数组交集,但您可以按如下方式编写查询:

var colors = session.Query<Color>()
                    .Where(c =>
                            c.colorArray.Any(x => x == "r") &&
                            c.colorArray.Any(x => x == "e") &&
                            c.colorArray.Any(x => x == "d"));

请注意,为了使其工作,您需要使用strings,而不是chars。colorArray您的类中的属性Color需要定义为:

public string[] colorArray { get; set; }

原因是,如果您使用char[],则查询将检查数字值(ASCII 代码)而不是字符串值(例如:'r'将被查询引擎解释为114'e'to101'd'to 100)。

现在,将其带到下一步并使查询条件动态化,相对于userInput字符串数组:

var userInput = new[] {"r", "e", "d"};

var colors = session.Query<Color>();

// dynamically add a WHERE clause for each letter in the array
foreach (var letter in userInput)
{
    var currentLetter = letter;

    colors = colors.Where(c => c.colorArray.Any(x => x == currentLetter));
}

// display the results
foreach (var color in colors)
    Console.WriteLine(color);

这应该会产生您期望的结果:具有"r"和在其 colorArray 中的文档"e""d"

于 2013-09-16T08:53:01.197 回答