Sql Web API中敏感过滤中的OData案例?

Sql Web API中敏感过滤中的OData案例?,sql,entity-framework,azure,asp.net-web-api,odata,Sql,Entity Framework,Azure,Asp.net Web Api,Odata,默认情况下,ODataController执行区分大小写的搜索。我们如何扩展此行为以执行不区分大小写的搜索 public class NammaODataController : ODataController { [EnableQuery] public IQueryable<FD> GetFD(ODataQueryOptions qo) { return _ctx.FDs.AsQueryAble(); //EF takes

默认情况下,ODataController执行区分大小写的搜索。我们如何扩展此行为以执行不区分大小写的搜索

public class NammaODataController : ODataController
{

    [EnableQuery]
    public IQueryable<FD> GetFD(ODataQueryOptions qo)
    {
        return _ctx.FDs.AsQueryAble();
        //EF takes care to apply odata query operators internally 
        //after control passes from action
    }
}
使用eq运算符

编辑 你是对的,问题与你的排序无关。它与您正在使用的odata表达式有关。在更新的测试查询中,您使用的是Contains,它被转换为带有通配符的LIKE,搜索值两端的任何零个或多个字符的字符串。但是,在odata表达式中,您使用的是eq,它将在EF表达式中转换为=,然后在SQL查询中再次转换为=。由于输出中显示的Pr_Name值与Tamara不完全相同,但包含Tamara,因此odata查询不会返回任何数据

您需要的是odata筛选器表达式子字符串,它将被EF转换为Contains,并在sql中转换为与搜索值两侧的通配符类似的内容

/FD?$filter=substringof(Pr_Name,'tamara')
有关更多筛选器表达式,请参阅

正如@ThomasKoelle在评论中指出的,这与列的排序有关。上面定义的OData管道使用实体框架,将传入的表达式转换为数据库的查询。因此OData表达式与此无关,构建的EF查询也与此无关

如果您有区分大小写的排序规则,那么您必须将所有搜索词和搜索列都设置为相同的大小写,这对性能非常不利,因为这些搜索子句不可搜索


对于大多数DBMS,列的排序规则是从数据库的默认排序规则继承的,该默认排序规则是从实例的默认排序规则继承的。您可以在每个级别进行重写,但必须在定义实例架构/数据库时显式执行。

您确定这不是数据库吗?检查字段的一种快速方法是写入:sp_help FD,然后在排序规则中有一个CS,它区分大小写。我从未尝试过是OData决定的地方。@ThomasKoelle,IMHO DB collation不会有帮助,因为OData在这里是命令,即使我们将DB表转换为不区分大小写的,OData管道也会将其转换为区分大小写的过滤器hanks@Igor,我已与MS确认,Azure SQL DB的默认排序规则是-SQL\u Latin1\u General\u CP1\u CI\u AS。这表示不区分大小写的排序规则。-AFAIK不需要对排序执行任何操作。@Abhijeet查看我的更新,请查看添加的链接,这可能与您的问题直接相关。@Abhijeet-我更新了我的答案,根据您以前的测试和显示的输出,这对您应该也有效。Contains我只是举个例子,SQL对eq运算符都不区分大小写。谢谢你。
void Main()
{
    var lower = FD
        .Where(sv => sv.Pr_Name == tamara A TOPOLESKI")
        .Take(1)
        .ToList();
    Console.WriteLine("LOWER CASE AZURE SQL OUTPUT");
    Console.WriteLine(lower);

    Console.WriteLine("UPPER CASE AZURE SQL OUTPUT");
    var upper = FD
        .Where(sv => sv.Pr_Name == "TAMARA TOPOLESKI")
        .Take(1)
        .ToList();
    Console.WriteLine(upper);
}
/FD?$filter=substringof(Pr_Name,'tamara')