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%'"
query2
和 query4
return 都正确,而 query
和 query3
不正确。为什么?我怎样才能让它发挥作用?
您的名称参数不等于"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)));
我正在尝试使用 .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%'"
query2
和 query4
return 都正确,而 query
和 query3
不正确。为什么?我怎样才能让它发挥作用?
您的名称参数不等于"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)));