我正在尝试使用.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%'"
query2
和query4
都会返回正确的值,而query
和query3
则不会。为什么?我怎样才能使它发挥作用?
答案 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) {
}
}
});