如何在 IQueryable 的 where 子句中调用函数
How to call a function inside a where clause of IQueryable
我想在 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(...)
方法表达为表达式树。
如果能帮助我设置它,我将不胜感激。
谢谢。
您对 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))
我想在 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(...)
方法表达为表达式树。
如果能帮助我设置它,我将不胜感激。
谢谢。
您对 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))