Linq 中的 LIKE 和 OR 等内容

Posted

技术标签:

【中文标题】Linq 中的 LIKE 和 OR 等内容【英文标题】:LIKEs and ORs and stuff in Linq 【发布时间】:2011-03-18 06:37:04 【问题描述】:

我正在尝试使用 || 编写一个 linq-to-sql 查询。当与 LIKE/Contains 结合使用时,其行为方式与 SQL 中的 OR 相同。

SQL

SELECT * FROM Users
WHERE GroupNumber = 'A123456'
OR (FirstName LIKE 'Bob%' AND LastName LIKE 'Smith%')

这将导致每个人的名字都像“Bob Smith”,以及 GroupNumber 完全等于 A123456 的每个人。在我的数据库中,sql 示例给了我三个结果(期望的结果):

A123456 约翰·戴维斯
A312345 鲍勃·史密斯
A123456 马特琼斯

Linq: (假设 PNum = A123456;first = "Bob";last = "Smith")

var users = from a in dc.Users
        where a.PolicyNumber == PNum || (SqlMethods.Like(a.FirstName, first + "%") && SqlMethods.Like(a.LastName, last + "%"))
        orderby a.PolicyNumber, a.FirstName
        select a;

这只会给我||左侧的结果:

A123456 约翰·戴维斯
A123456 马特琼斯

我也尝试过 a.Contains() 和 a.StartsWith() 但在每个版本中我得到相同的两个结果。当我删除任何 Like/Contain/StartsWith 时,我得到了想要的结果,但我需要使用通配符。如何在 Linq 查询中获得所有三个结果?

【问题讨论】:

【参考方案1】:

在这种情况下,我肯定会使用StartsWith,只是为了让代码在阅读时更像 C#——但这应该可以工作:

var users = from a in dc.Users
        where a.PolicyNumber == PNum 
              || (a.FirstName.StartsWith(first) && a.LastName.StartsWith(last))
        orderby a.PolicyNumber, a.FirstName
        select a;

如果该查询不起作用,您可以发布它生成的 SQL 吗?只需设置上下文的日志以将其写入控制台,或者任何最简单的。 (我会编写一个控制台应用程序来测试这个问题 - 它比每次都运行一个 UI 更容易。)

【讨论】:

【参考方案2】:

您的查询在我看来确实正确。

您是否尝试过查看日志以查看发出了什么 SQL?

【讨论】:

以上是关于Linq 中的 LIKE 和 OR 等内容的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的Like和正则表达

LINQ中的SQL Like子句[重复]

C# 版本的 SQL LIKE

在带有 Linq 的实体框架中使用 LIKE "%%%"? [复制]

带有 LIKE 数组的 PHP 和 MYSQLI:无法正确回显所有内容

Linq中使用模糊查找