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 等内容的主要内容,如果未能解决你的问题,请参考以下文章
在带有 Linq 的实体框架中使用 LIKE "%%%"? [复制]