LINQ查询无法评估StartsWith中的GET参数

时间:2015-03-18 20:35:13

标签: c# asp.net linq entity-framework asp.net-web-api

我正在尝试使用.NET Web API和使用LINQ和MySQL db的实体框架通过GET请求(在Angular.js中)进行查询。

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();
    }

我的WebApiConfig.cs有以下几行:

config.Routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{name}",
    defaults: null
);

我认为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%'"

query2query4都会返回正确的值,而queryquery3则不会。为什么?我怎样才能使它发挥作用?

3 个答案:

答案 0 :(得分:1)

这是MySQL Entity Framework 6.9.5的报告错误

Bug#74918:Entity Framework 6的查询结果不正确: https://bugs.mysql.com/bug.php?id=74918

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

更新日志: 使用Entity Framework 6,将字符串引用传递给“StartWith” 子句会返回不正确的结果。

或者,解决方法是使用.Substring(0)强制实体不使用LIKE(可能会影响性能)。

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

答案 1 :(得分:0)

您的name参数不等于“M”,该值可能为null。 WebApi可能需要“id”参数而不是“name”

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

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

答案 2 :(得分:0)

如果您有多个带参数的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" });

你的行动:

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

像这样称呼

        $.ajax({
        type: 'GET',
        url: 'localhost/ProductsApp/api/clientes/GetByName?Name='+ M,
        data: JSON.stringify({}),
        contentType: 'application/json',
        dataType: 'json',
        success: function (data) {

            }
        }
    });