gpt4 book ai didi

c# - 使用 .Contains(variable) 的 MySQL Linq

转载 作者:行者123 更新时间:2023-11-29 01:28:36 25 4
gpt4 key购买 nike

设置信息:

  • VS2013/C#
  • EF6
  • MySQL数据库
  • .Net 连接器 6.9.5

我正在尝试创建一种方法,该方法使用部分名称作为搜索条件返回帐户记录的集合。如果我使用 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 运算符,但我不明白变量是如何注入(inject)的:

SELECT
`Extent1`.`accountid`,
`Extent1`.`accountname`
FROM `account` AS `Extent1`
WHERE `Extent1`.`accountname` LIKE '%p__linq__0%'

那么...为什么它使用硬编码值而不是字符串变量?

最佳答案

我遇到了同样的问题,并使用 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);
}

关于c# - 使用 .Contains(variable) 的 MySQL Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27338108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com