C# LINQ查询无法计算StartsWith中的GET参数

C# LINQ查询无法计算StartsWith中的GET参数,c#,asp.net,linq,entity-framework,asp.net-web-api,C#,Asp.net,Linq,Entity Framework,Asp.net Web Api,我试图通过Angular.js中的GET请求,使用.NET Web API和实体框架,使用LINQ和MySQL db进行查询 http://localhost/ProductsApp/api/clientes/GetByName/M 问题在于,GET传递的参数没有被计算,即使根据调试器将name正确设置为M,我也没有得到任何结果。 但是,如果我硬编码一个字符串,就会得到预期的结果 [ActionName("GetByName")] public IEnumerable<c

我试图通过Angular.js中的GET请求,使用.NET Web API和实体框架,使用LINQ和MySQL db进行查询

http://localhost/ProductsApp/api/clientes/GetByName/M
问题在于,GET传递的参数没有被计算,即使根据调试器将name正确设置为M,我也没有得到任何结果。 但是,如果我硬编码一个字符串,就会得到预期的结果

    [ActionName("GetByName")]
    public IEnumerable<cliente> GetByName(string name)
    {

        var query = from c in context.clientes where c.nome.StartsWith(name) select c;
        var query2 = from c in context.clientes where c.nome.StartsWith("M") select c;
        var query3 = context.clientes.Where(c => c.nome.StartsWith(name));
        var query4 = context.clientes.Where(c => c.nome.StartsWith("M"));

        return query.ToList();
    }
我假设LINQ在执行时解析变量,如下所示,我删除了查询中不重要的部分:

query.ToString()
"SELECT [...] WHERE `Extent1`.`nome` LIKE 'p__linq__0%'"
query2.ToString()
"SELECT [...] WHERE `Extent1`.`nome` LIKE 'M%'"
query3.ToString()
"SELECT [...] WHERE `Extent1`.`nome` LIKE 'p__linq__0%'"
query4.ToString()
"SELECT [...] WHERE `Extent1`.`nome` LIKE 'M%'"

query2和query4都返回正确的值,而query和query3则不返回正确的值。为什么?如何使其工作?

您的name参数不等于M,此值可能为空。WebApi可能需要一个id参数而不是名称

添加route属性以确保将正确的值传递给name参数

[Route("api/clientes/GetByName/{name}")]
public IEnumerable<cliente> GetByName(string name)
{
    ....
}

如果有多个带有参数的GET方法,则必须更改WebApiConfig.cs

           config.Routes.MapHttpRoute(
            name: "ActionApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional });
或者另一种方法,您必须在WebApiConfig.cs中硬编码控制器和操作,如下所示

            config.Routes.MapHttpRoute(
             name: "GetApi",
             routeTemplate: "api/{controller}/{action}/{id}",
             defaults: new { action = "GetByName", controller = "Your Controller" });
        $.ajax({
        type: 'GET',
        url: 'localhost/ProductsApp/api/clientes/GetByName?Name='+ M,
        data: JSON.stringify({}),
        contentType: 'application/json',
        dataType: 'json',
        success: function (data) {

            }
        }
    });
你的行动:

[HttpGet]
public IEnumerable<cliente> GetByName(string name)
{
}

这是MySQL实体框架6.9.5中报告的错误

错误74918:实体框架6的查询结果不正确:

它已在MySQL Connector/Net 6.7.7/6.8.5/6.9.6版本中修复

更改日志: 使用实体框架6,将字符串引用传递给StartWith 子句将返回不正确的结果

或者,解决方法是使用.Substring0,它强制实体不使用LIKE,这可能会影响性能

var query = context.clientes.Where(c => c.nome.StartsWith(name.Substring(0)));

即使名称被正确地设置为M,您似乎有一些非常令人信服的证据表明情况并非如此。你怎么知道名称被设置为M?@Servy,因为调试器告诉我是这样的。可能弄错了吗?@user2753837请提供query.ToString生成的填充查询。像“p_uLinq_u0%”看起来不正确。它应该类似于“@p\u linq\u 0+'%”。实体框架似乎没有创建正确的参数。这就是为什么你什么都没有得到back@Ockert选择\r\next1.cliente\u id、\r\next1.nome、\r\next1.email、\r\next1.endereco\r\n从cliente`作为Extent1\r\n其中Extent1.nome类似于'p\u linq\u 0%`您使用的EF版本是什么?我对EF 6做了类似的操作,生成的查询与您的不一样;调试器告诉我名称是MDo,您有多个Get方法parameter@DineshChauhan另一个带有参数的get方法是接收id…/api/clientes/id的默认方法。调试时,正确的方法将被调用,并使用配置文件更新问题。我也试过你的可能性,但还是不行
var query = context.clientes.Where(c => c.nome.StartsWith(name.Substring(0)));