我有一个看起来像这样的查询:
IQueryable<Profile> profiles = from p in connection.Profiles where profile.Email.Contains(txtSearch) select p;
我知道当它转换为sql时,它使用LIKE’%< txtSearch>%’的值,但是如果txtSearch =“jon%gmail.com”它将它转换为`LIKE’%jon~%gmail.com%’ . 〜逃脱了中间的百分比,这是一张外卡.我该如何解决这个问题?我需要能够将通配符放入我的LINQ到EF搜索中.
解决方法
我不确定这是否可以直接使用linq,因为你只能调用像Contains,StartsWith或EndsWith这样的基本字符串函数.
It is possible with Entity SQL所以你可以结合这些方法.
var query = new ObjectQuery<Profile>( @"SELECT VALUE p FROM CsdlContainerName.Profiles AS p WHERE p.Email LIKE '" + wildcardSearch + "'",context); var result = query.AsQueryable().OrderByDescending(p => p.Name).ToList();
Esql注入反击:)
没有注入漏洞的第二个版本(我没有尝试但它应该工作):
var commandText = @"SELECT VALUE p FROM CsdlContainerName.Profiles AS p WHERE p.Email LIKE @search"; var query = new ObjectQuery<Profile>(commandText,context); query.Parameters.Add(new ObjectParameter("search",wildcardSearch)); var result = query.AsQueryable().OrderByDescending(p => p.Name).ToList();