【发布时间】:2015-05-21 19:57:51
【问题描述】:
我正在尝试通过 GET 请求(在 Angular.js 中)使用 .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();
}
我的 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 则不返回。为什么?我怎样才能让它发挥作用?
【问题讨论】:
-
even though name is being set correctly to "M"您似乎有一些非常令人信服的证据表明情况并非如此。你怎么知道name被设置为M? -
@Servy 因为调试器告诉我。会不会弄错了?
-
@user2753837 您能否提供由 query.ToString() 生成的填充查询。 “LIKE 'p__linq__0%'”看起来不正确。它应该类似于“LIKE `@p__linq__0 + '%'”。看起来实体框架没有创建适当的参数。这就是为什么你会收到回复
-
@ Ockert
"SELECT\r\nExtent1.cliente_id, \r\nExtent1.诺姆, \r\nExtent1.电子邮件, \r\nExtent1.endereco\r\nFROMcliente` ASExtent1\r\n WHEREExtent1.nomeLIKE 'p__linq__0%'"` -
您使用的是什么版本的 EF?我用 EF 6 做了类似的事情,生成的查询和你的不一样。
标签: c# asp.net linq entity-framework asp.net-web-api