gpt4 book ai didi

c# - LINQ 表达式未被转换为 SQL

转载 作者:太空狗 更新时间:2023-10-30 00:48:23 25 4
gpt4 key购买 nike

我正在尝试从 LINQ 实现一个已编译的 SQL 查询,它将检查 query 是否是数据库中三列中任何一列的子字符串(不区分大小写)。

我正在使用 .NET Core 1.1

我想出的查询如下:

users.Select(u => new
{
User = u,
query = u.FirstName.ToLower() + u.LastName.ToLower() + u.Email.ToLower()
}).Where(x => x.query.Contains(query))

但是在查看调试信息时,我收到了这个警告:

The LINQ expression '(([u].FirstName.ToLower() + [u].LastName.ToLower()) + [u].Email.ToLower()).Contains(__query_0)' could not be translated and will be evaluated locally.

我尝试的第二个查询:

 users.Where(x => u.FirstName.ToLower().Contains(query) || u.LastName.ToLower().Contains(query) || u.Email.ToLower().Contains(query))

但它给了我完全相同的警告。

为什么会这样?我正在寻找类似的东西:

SELECT * FROM USERS WHERE FirstName LIKE query OR LastName LIKE query OR Email LIKE query

更新

我又做了一个实验:

    users.Where(u =>
u.FirstName.Contains(query) ||
u.LastName.Contains(query) ||
u.Email.Contains(query));

这也导致了

The LINQ expression '(([u].FirstName.Contains(__query_0) OrElse [u].LastName.Contains(__query_1)) OrElse [u].Email.Contains(__query_2))' could not be translated and will be evaluated locally.

最佳答案

这是因为 .ToLower().Contains() 是字符串类中的函数,无法由 linq 提供程序转换为 SQL。
所有查询(除非明确指定)都将遵循数据库排序规则,如果是 CI,则不区分大小写,您不需要 .ToLower()。至于.Contains(),你需要使用实体函数Like

users.Where(u =>
EF.Functions.Like(u.FirstName, "%" + query + "%") ||
EF.Functions.Like(u.LastName, "%" + query + "%") ||
EF.Functions.Like(u.Email, "%" + query + "%"));

然而这似乎是在 EF core 2.0 中添加的。对于 1.1,我认为没有任何方法可以做到。我建议跳过 EF 并直接编写普通的旧 SQL。

关于c# - LINQ 表达式未被转换为 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46952296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com