我有一个简单的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 ...
答案 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
,而不是char
。 colorArray
类中的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"
的文档。