【发布时间】:2018-05-11 19:49:30
【问题描述】:
我必须使用 Entity Framework 和 Lamda 表达式获取所有 titleName 与“searchText”字符串中至少一个单词匹配的标题。当有空间时,我将 searchText 拆分并将结果存储在数组中。我正在编写以下代码,但无法获得所需的输出。
var searchTextArray = searchText.Split(' ');
var result = entities.titles.Where(x => searchTextArray.Contains(x.titleName));
假设searchText 包含“孤独管理” 字符串,那么我想获取所有标题中包含titleName 的任何单词。 在这种情况下,我应该得到 titleNames 为
的标题Some loneliness affect all
Loneliness is painful
School Management
Proper management
...
更新 1: 上面的查询生成的 SQL 为
SELECT * FROM titles WHERE (LOWER(titleName) IN (N'loneliness', N'management')) AND (LOWER(titleName) IS NOT NULL)
但我想生成像这样的查询
SELECT * FROM titles WHERE titleName like N'%loneliness%' or titleName like N'%management%'
我在上面的表达式中遗漏了什么?
更新 2
我从@3dGrabber 的答案中得到了预期的输出,但生成的 SQL 查询仍然比 T-SQL 中的 LIKE 运算符有点混乱。非常感谢大家。生成的 SQL 现在就像
SELECT
*
FROM [dbo].[titles] AS [Extent1]
WHERE EXISTS (SELECT
1 AS [C1]
FROM (SELECT
N'loneliness' AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
UNION ALL
SELECT
N'management' AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable2]) AS [UnionAll1]
WHERE ( CAST(CHARINDEX([UnionAll1].[C1], LOWER([Extent1].[titleName])) AS int)) > 0
)
【问题讨论】:
-
以上在哪些方面不适合您?
-
这应该可以。也许你想做不区分大小写的搜索?您可以将
.ToLower()应用到searchText和x.titleName -
@SlavenTojić 为什么添加
ToArray会有任何不同? -
再一次,上面的代码在什么方面不适合你?你得到什么输出?
-
lambda 中的 C# linq 表达式,包含 click here
标签: c# entity-framework-6