如何在LINQ到实体框架中使用SQL通配符
我有一个如下的查询:如何在LINQ到实体框架中使用SQL通配符,sql,c#-4.0,entity-framework-4,Sql,C# 4.0,Entity Framework 4,我有一个如下的查询: IQueryable<Profile> profiles = from p in connection.Profiles where profile.Email.Contains(txtSearch) select p; IQueryable profiles=来自p in connection.profiles 其中profile.Email.Contains(txtSearch) 选择p; 我知道,当它转换为SQL时,它会使用类似“%”的
IQueryable<Profile> profiles = from p in connection.Profiles
where profile.Email.Contains(txtSearch)
select p;
IQueryable profiles=来自p in connection.profiles
其中profile.Email.Contains(txtSearch)
选择p;
我知道,当它转换为SQL时,它会使用类似“%”的
,但如果txtSearch=“jon%gmail.com”
它会将它转换为类似“%jon~%gmail.com%”。在中间,这是一张通配符。我该怎么做?我需要能够将通配符放入我的LINQ到EF搜索中。我不确定直接使用LINQ是否可行,因为您只能调用基本的字符串函数,如包含
,开始使用
或结束使用
。所以你可以把这些方法结合起来
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();
var query=newobjectquery(
@“选择值p
来自CsdlContainerName.Profiles作为p
其中p.电子邮件,如“+wildcardSearch+”,
上下文);
var result=query.AsQueryable();
ESQL注入回击:)
没有注入漏洞的第二个版本(我没有尝试,但应该可以工作):
var命令文本=
@“选择值p
来自CsdlContainerName.Profiles作为p
其中p.电子邮件,如@search”;
var query=newobjectquery(commandText,context);
添加(新的ObjectParameter(“search”,wildcardSearch));
var result=query.AsQueryable();
我正在创建的页面是一个管理页面,因此我不担心SQL注入攻击,但上面的方法不会让我面临SQL注入攻击吗?我想是的,但实际上没有尝试过(请参阅代码段下面的注释)。但您也可以使用带有参数的版本-我将添加它作为第二个示例。
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();