我想知道在具有动态值的sql中进行查询的最佳实践是什么,假设我有一个值(nvarchar(max))
价值:" 912345678"
select * from AllData
where Number like '%912345678%'
价值:"迈克尔"
select * from AllData
where Name like '%Michael%'
值:"街道号码10"
select * from AllData
where Address like '%Street number 10%'
这个approuches有点慢,因为搜索一个有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();
我如何提高表现?
答案 0 :(得分:13)
varchar
/ nvarchar
字段中的通配符搜索会对符合条件的记录或多或少地迭代每个字符。
这类搜索的优秀(快速!)选项是:
CONTAINS
关键字而不是通配符。你提到寻找可靠的消息来源,here是一个很好的阅读。
答案 1 :(得分:2)
如果使用LIKE
和PATINDEX
无法获得所需的性能,那么您可能应该编写将使用FTS的sp。
答案 2 :(得分:2)
要在EF中使用“赞”进行搜索,您可以使用包含():
var Result = EDMXEntity.Entities.Where(
x => x.Name.Contains(Value) ||
x => x.Number.ToString().Contains(Value) ||
x => x.Address.Contains(Value)).Take(50).ToList();
但是通过这种搜索,你永远无法获得良好的表现。 您需要更改在数据库中搜索或存储数据的方式。 例如,如果您确定用户正在查找名称,则只能在“名称”列中搜索。