如何在 entity framework lambda 表达式中使用 Like 运算符
How to use Like operator in entity framework lamba expression
我正在编写一个 sql 搜索查询,用户根据名字和姓氏进行搜索。当搜索 FirstName 或 LastName 时,查询工作正常,但当我搜索 FirstName 和 LastName(即 FirstName 和 LastName 之间的 space)时,它给出空白结果。查询字符串如下所示:
http://localhost:4562/api/User/Search?q=sumedha%20v&filters=&offset=3&limit=9
sql 查询是:List<AppUser> searchedAppUsers = await _context.AppUser.Where(u => u.Profile.FirstName.StartsWith(q) || u.Profile.LastName.StartsWith(q)).ToListAsync();
我尝试使用 Contains()
而不是 StartsWith()
,但它仍然给出空白结果。我也尝试使用 SqlMethods.Like()
但在智能感知中看不到它。我尝试使用 SqlFunctions.PatIndex()
,但同样的问题。我试图遵循 this post,但不知道如何去做。
还有别的办法吗?还是我哪里出错了?
首先,您的查询只检查名字:
列出 searchedAppUsers = await _context.AppUser.Where(u => u.Profile.FirstName.StartsWith(q) || u.Profile.FirstName.StartsWith(q)).ToListAsync();
其次,据我了解,您正在搜索类似 "John Doe" 的内容,但 FirstName ("John") 和 LastName ("Doe") 都不是以 "John Doe" 开头(或者是喜欢'John Doe%')。
再想想你的 SQL 会是什么。
嗯,如果您的搜索词是 "sumedha v",很明显没有 FirstName
或 LastName
包含此字符串。您显然在寻找这样的东西:
_context.AppUser
.Where(u => (u.Profile.FirstName + " " + u.Profile.LastName).Contains(q))
但这可能表现不佳,因为现在查询引擎不能在名称字段上使用任何索引。如果没有很多(几千个)用户,这应该不是问题。
也许您打算分别使用搜索字符串的第一部分和第二部分对 FirstName
和 LastName
进行搜索?像这样:
var parts = q.Split(q, ' ');
var q1 = parts[0];
var q2 = parts[1];
var result = _context.AppUser
.Where(u => u.Profile.FirstName.Contains(q1)
&& u.Profile.LastName.Contains(q2));
(没有空检查)
这样性能会更好,因为名称字段是直接查询的。
我正在编写一个 sql 搜索查询,用户根据名字和姓氏进行搜索。当搜索 FirstName 或 LastName 时,查询工作正常,但当我搜索 FirstName 和 LastName(即 FirstName 和 LastName 之间的 space)时,它给出空白结果。查询字符串如下所示:
http://localhost:4562/api/User/Search?q=sumedha%20v&filters=&offset=3&limit=9
sql 查询是:List<AppUser> searchedAppUsers = await _context.AppUser.Where(u => u.Profile.FirstName.StartsWith(q) || u.Profile.LastName.StartsWith(q)).ToListAsync();
我尝试使用 Contains()
而不是 StartsWith()
,但它仍然给出空白结果。我也尝试使用 SqlMethods.Like()
但在智能感知中看不到它。我尝试使用 SqlFunctions.PatIndex()
,但同样的问题。我试图遵循 this post,但不知道如何去做。
还有别的办法吗?还是我哪里出错了?
首先,您的查询只检查名字:
列出 searchedAppUsers = await _context.AppUser.Where(u => u.Profile.FirstName.StartsWith(q) || u.Profile.FirstName.StartsWith(q)).ToListAsync();
其次,据我了解,您正在搜索类似 "John Doe" 的内容,但 FirstName ("John") 和 LastName ("Doe") 都不是以 "John Doe" 开头(或者是喜欢'John Doe%')。
再想想你的 SQL 会是什么。
嗯,如果您的搜索词是 "sumedha v",很明显没有 FirstName
或 LastName
包含此字符串。您显然在寻找这样的东西:
_context.AppUser
.Where(u => (u.Profile.FirstName + " " + u.Profile.LastName).Contains(q))
但这可能表现不佳,因为现在查询引擎不能在名称字段上使用任何索引。如果没有很多(几千个)用户,这应该不是问题。
也许您打算分别使用搜索字符串的第一部分和第二部分对 FirstName
和 LastName
进行搜索?像这样:
var parts = q.Split(q, ' ');
var q1 = parts[0];
var q2 = parts[1];
var result = _context.AppUser
.Where(u => u.Profile.FirstName.Contains(q1)
&& u.Profile.LastName.Contains(q2));
(没有空检查)
这样性能会更好,因为名称字段是直接查询的。