Ravendb数组相交

时间:2013-09-10 11:38:35

标签: arrays ravendb intersect

我有一个简单的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 ...

1 个答案:

答案 0 :(得分: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"));

请注意,为了实现此目的,您需要使用string,而不是charcolorArray类中的Color属性需要定义为:

public string[] colorArray { get; set; }

原因是如果您使用char[],则查询将检查数值(ASCII代码),而不是字符串值(例如:'r'将被查询引擎解释为114'e'101'd'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);

这应该会产生您期望的结果:在colorArray中包含"r""e""d"的文档。