如何在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();