【发布时间】:2021-12-10 15:04:38
【问题描述】:
我想在 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);
但是,这种理想的编码是行不通的。我得到一个例外:“无法理解表达式......”指的是整个 where 子句。
到目前为止,我认为我需要将ruleInstances.Contains(...) 方法表达为表达式树。
我将不胜感激设置它。
谢谢。
【问题讨论】:
-
您是否尝试过加入?我不确定这是否允许它在服务器端运行,或者它是否仍然在内部关闭
Instances 在执行连接之前 - 但你可以试一试 - 像这样:.Join(ruleInstances, i => i.Name, r => r, (i, r) => i, StringComparer.OrdinalIgnoreCase).ToList(); -
如您所述,需要构建表达式树。通过实施您的 ComparerExtension 来改进您的问题。它是 NHibernate 吗?
标签: c# linq expression-trees iqueryable