LINQ中的SQL Like子句[重复]

Posted

技术标签:

【中文标题】LINQ中的SQL Like子句[重复]【英文标题】:SQL Like clause in LINQ [duplicate] 【发布时间】:2021-12-19 16:34:15 【问题描述】:

我正在尝试将 SQL Server 存储过程迁移到 LINQ,但当我有一个需要在主表中找到的部分匹配列表时遇到了困难。

简而言之,我需要将以下 SQL 复制到 LINQ 中。任何帮助将不胜感激。

SQL

DECLARE @filters TABLE([filter] NVARCHAR(20))

INSERT INTO @filters VALUES ('Den%');
INSERT INTO @filters VALUES ('%zil');
INSERT INTO @filters VALUES ('%la%');

SELECT c.*  
FROM [Northwind].[dbo].[Customers] c
INNER JOIN @filters f ON c.Country LIKE (f.filter)
ORDER BY Country

C#

var filters = new string[]  "Den*", "*zil", "*la*" ;

var results = from C in ctx.Customers
              join f in filters c.Country like f
              Select new 
                     
                         c.CustomerId,
                         c.Country
                     ;

【问题讨论】:

我假设您意识到 country = 'Denlazil" 的行将返回 3 行? 【参考方案1】:
var result = context.Customers.AsNoTracking()
                    .Include(x => x.Country)
                    .Where(x => x.Country.Contains("la") || x.Country.Startwith("Den") || x.Country.EndWith("zil"))

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

您可以使用 EF Core 中提供的 EF.Functions.Like() 方法。 我们在字符串中使用% 表示LIKE,而不是*。 所以你的查询看起来像:

var filters = new string[]  "Den%", "%zil", "%la%" ;

var result = context.Customers.AsNoTracking()
                 .Where(c => filters.Any(f => EF.Functions.Like(c.Country, f)))
                 .OrderBy(c => c.Country)
                 .ToList();

如果您只有一个过滤器,那么您的查询将简化为:-

var filter = "%la%";

var result = context.Customers.AsNoTracking()
                 .Where(c => EF.Functions.Like(c.Country, filter))
                 .OrderBy(c => c.Country)
                 .ToList();

【讨论】:

【参考方案3】:

你可以使用以下示例:

var result = context.Customers.AsNoTracking()
                    .Include(x => x.Country)
                    .Where(x => x.Country.Contains("Den"));

作为这个例子:

https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.contains?view=net-5.0

【讨论】:

以上是关于LINQ中的SQL Like子句[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C# 版本的 SQL LIKE

使用带参数的 LIKE 时 SQL 引发语法错误 [重复]

如何在linq where子句中将int与字符串进行比较[重复]

如何将重复的 where 子句表达式从 linq 拉到函数中?

SQL中的NOT LIKE IN语句[重复]

为啥 SQL 强制我在 GROUP BY 子句中重复 SELECT 子句中的所有非聚合字段? [关闭]