我想知道在sql中使用动态值进行查询的最佳实践是什么,假设我有一个值(nvarchar(Max))
值:"912345678"
select * from AllData
where Number like '%912345678%'
值:"Michael"
select * from AllData
where Name like '%Michael%'
取值:“10号街”
select * from AllData
where Address like '%Street number 10%'
这种方法有点慢,因为搜索一个有9位数字的数字会更快,没有这样的%
select * from AllData
where Number like '912345678'
我使用EDMX与C#中的外部数据库建立连接,如下所示:
var Result = EDMXEntity.Entities.Where(x =>
(SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Name.ToString().ToLower()) > 0)
|| (SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Number.ToString().ToLower()) > 0)
|| (SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Address.ToString().ToLower()) > 0)).Take(50).ToList();
如何提高性能?
发布于 2015-06-22 19:14:48
像这样在varchar
/nvarchar
字段上的通配符搜索将遍历每个字符,或多或少地遍历符合条件的记录。
很棒(而且很快!)这类搜索的选项是:
CONTAINS
关键字,而不是通配符。你提到寻找可靠的来源,here是一个很好的读物。
发布于 2015-06-19 19:35:26
如果使用LIKE
和PATINDEX
不能获得所需的性能,那么您可能应该编写使用FTS的sp。
发布于 2015-06-25 01:11:13
要在EF中使用'like‘进行搜索,您可以使用Contains()
var Result = EDMXEntity.Entities.Where(
x => x.Name.Contains(Value) ||
x => x.Number.ToString().Contains(Value) ||
x => x.Address.Contains(Value)).Take(50).ToList();
但使用这种搜索方式,您永远不会获得良好的性能。您需要更改在数据库中搜索或存储数据的方式。例如,如果您确定用户正在查找姓名,则只能在“姓名”列中进行搜索。
https://stackoverflow.com/questions/30936825
复制相似问题