2011-03-24 79 views
6

我有一个查询,看起来像这样:如何使用SQL通配符在LINQ到实体框架

IQueryable<Profile> profiles = from p in connection.Profiles 
    where profile.Email.Contains(txtSearch) 
    select p; 

我知道,当这个被转换为SQL它采用了LIKE '%<value of txtSearch>%'但如果txtSearch = "jon%gmail.com"它把它转换成` LIKE'%jon〜%gmail.com%'。 〜逃脱中间的百分比,这是一张通配符。我该如何解决这个问题?我需要能够将通配符放入我的LINQ to EF搜索中。

回答

2

我不确定这是否可以直接使用linq,因为您只能调用基本字符串函数,如ContainsStartsWithEndsWithIt 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(); 
+0

我创建的页面是一个管理页面所以我不担心SQL注入攻击,但是上面的方法不会让我知道SQL注入攻击吗? – 2011-03-25 13:27:14

+0

我认为它确实,但实际上没有尝试它(请参阅我的评论以下代码段)。但你也可以使用带参数的版本 - 我将把它作为第二个例子添加。 – 2011-03-25 13:32:21