首页 > 解决方案 > 如何编写此扩展方法以由 EF Core 转换为 SQL Server?

问题描述

我在我的 .NET 代码中有这个扩展方法检查字符串是否是:

public static bool IsSomething(this string text)
{
   var isNothing = string.IsNullOrEmpty(text) || string.IsNullOrWhiteSpace(text);
   return !isNothing;
}

但是,我不能在我的 EF Core quereis 中使用它:

dbset.Where(i => i.Title.IsSomething()); // throws non-translatable error

我知道我可以将查询重写为:

dbset.Where(i => i.Title != null && i.Title.Trim() != ""); // this works, but it's too verbose

但我真的不想写那么长的非描述性代码。

我如何才能IsSomething为 SQL Server 翻译?

标签: c#.netsql-serverlinqentity-framework-core

解决方案


只需使用IsNullOrWhiteSpace; 它做了什么IsNullOrEmpty

true如果 value 参数为 null 或 Empty,或者 value 仅由空白字符组成,则 返回。-- IsNullOrWhiteSpace 的文档

它由 EF Core 映射到 SQL

@value IS NULL OR LTRIM(RTRIM(@value)) = N''

请注意,在 EF Core 6 中,这更改为@value IS NULL OR value= N''- 相同的交易;SQLS 忽略字符串 comp 中的尾随空格

这意味着您的IsSomething方法是有效!IsNullOrWhiteSpace的,如果您使用它,EF 将翻译它。


推荐阅读