设置信息:
我正在尝试创建一个方法,该方法使用部分名称作为搜索条件返回帐户记录的集合。如果我使用IQueryable .Contains()扩展方法对字符串值进行硬编码,则返回数据。但是,当我尝试使用变量时,不会返回任何数据。
Public class Test() {
MyEntities db = new MyEntities();
//Works....but the search criteria is hard coded.
public IQueryable<Account> WorksButValueHardCoded() {
return (from a in db.Accounts
where a.accountname.Contains("Test")
select a);
}
//Does not return anything
public IQueryable<Account> DoesNotReturnAnyData() {
//Obviously I would use a parameter, but even this test fails
string searchText = "Test";
return (from a in db.Accounts
where a.accountname.Contains(searchText)
select a);
}
}
我可以在LINQ中看到生成的SQL使用了LIKE运算符,但我不明白变量是如何在读取时注入的:
SELECT
`Extent1`.`accountid`,
`Extent1`.`accountname`
FROM `account` AS `Extent1`
WHERE `Extent1`.`accountname` LIKE '%p__linq__0%'
那么......为什么它适用于硬编码值而不是字符串变量?
答案 0 :(得分:5)
我遇到了同样的问题,并一步一步地跟着错误使用Glimpse(用于检查服务器正在做什么的好工具)。事实证明,SQL语句是正确构建的,因为我通过在数据库上执行它来获得结果。 问题可能是在语句中替换字符串变量。我猜LINQ并不是只替换你传递的字符串,而是将带有空格的变量填充到VARCHAR限制,这样你的查询就像
SELECT`Extent1`.`accountid`, `Extent1`.`accountname`
FROM `account` AS `Extent1`
WHERE `Extent1`.`accountname` LIKE '%Test ... %'
添加
.Trim()
到你的字符串,它可以工作。
public IQueryable<Account> DoesNotReturnAnyData() {
string searchText = "Test";
// Use Trim() here
return (from a in db.Accounts
where a.accountname.Contains(searchText.Trim())
select a);
}
答案 1 :(得分:0)
理论上没有任何错误我可以看到
<强>更新强>
这对我来说在sqlServer
上运行正常public IQueryable<Account> DoesNotReturnAnyData(MyEntities db,string searchText) {
return (from a in db.Accounts
where a.accountname.Contains(searchText )
select a)
}
答案 2 :(得分:0)
这是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,将字符串引用传递给&#34; StartWith&#34; 子句会返回不正确的结果。
或者,解决方法是使用.Substring(0)
强制实体不使用LIKE
(可能会影响性能)。
return (from a in db.Accounts
where a.accountname.Contains(searchText.Substring(0))