我想在IQueryable语句内执行Where子句,因此它将在数据库端完成,而不是在客户端进行选择。我现在的代码是:
var all = await session.Query<Instance>()
.ToListAsync()
.ConfigureAwait(false);
var insts = all.Where(i => ruleInstances.Contains(i.Name,
new ComparerExtension<string>(
(x, y) => string.Compare(x, y, StringComparison.OrdinalIgnoreCase) == 0,
h => h.ToLower().GetHashCode())));
在客户端执行选择。
理想情况下,我可以这样写IQueryable:
var all = await session.Query<Instance>()
.Where(i => ruleInstances.Contains(i.Name,
new ComparerExtension<string>(
(x, y) => string.Compare(x, y, StringComparison.OrdinalIgnoreCase) == 0,
h => h.ToLower().GetHashCode())))
.ToListAsync()
.ConfigureAwait(false);
然而,这种理想的编码是行不通的。我得到一个异常:&;Could not understand expression…&;引用整个where子句
现在我认为我需要将ruleInstances.Contains(...)
方法表示为表达式树。
如果你能帮我设置,我会很感激的。
谢谢。
ComparerExtension
的实例化和调用不能在服务器端完成,因此它不能转换为在那里运行。请注意,在最后,库必须创建一个SQL语句发送到服务器,而不是函数或类似的东西。如果您需要在服务器端进行不区分大小写的比较,则必须确保服务器为数据库使用正确的排序规则(例如SQL_Latin1_General_CP1_CI_AS),在这种情况下,您可能会发送:
.Where(i => ruleInstances.Contains(i.Name))
如果这真的有效,取决于ruleInstances的类型。也许你必须把它转换成一个简单的字符串列表,并使用如下:
var ruleInstanceNames = ruleInstances.Select(rule => rule.Name).ToList();
... .Where(i => ruleInstanceNames.Contains(i))