【问题标题】:How to use SQL wildcards in LINQ to Entity Framework如何在 LINQ to Entity Framework 中使用 SQL 通配符
【发布时间】:2011-03-24 20:35:35
【问题描述】:

我的查询如下所示:

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

我知道当它转换为 SQL 时,它使用 LIKE '%&lt;value of txtSearch&gt;%',但如果 txtSearch = "jon%gmail.com" 它将它转换为 `LIKE '%jon~%gmail.com%'。 ~ 转义了中间的 % ,即通配符。我该如何解决?我需要能够将通配符放入我的 LINQ to EF 搜索中。

【问题讨论】:

    标签: sql c#-4.0 entity-framework-4


    【解决方案1】:

    我不确定这是否可以直接使用 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();
    

    【讨论】:

    • 我正在创建的页面是一个管理页面,所以我不担心 SQL 注入攻击,但上述方法不会让我面临 SQL 注入攻击吗?
    • 我认为可以,但实际上没有尝试过(请参阅我在代码 sn-p 下方的评论)。但您也可以使用带参数的版本 - 我将添加它作为第二个示例。
    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    相关资源
    最近更新 更多