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

LINQ query cannot evaluate GET parameter in StartsWith

我正在尝试使用 .NET Web API 和 Entity Framework 使用 LINQ 和 MySQL 数据库通过 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 return 都正确,而 queryquery3 不正确。为什么?我怎样才能让它发挥作用?

您的名称参数不等于"M",可能该值为空。 WebApi 可能需要一个 "id" 参数而不是 "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" });

您的操作:

[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) {

            }
        }
    });

这是 MySQL Entity Framework 6.9.5

报告的错误

错误#74918:Entity Framework6 的查询结果不正确: https://bugs.mysql.com/bug.php?id=74918

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

变更日志: 用 Entity Framework 6,传入一个字符串引用到 "StartWith" 子句会 return 不正确的结果。

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

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