我的解决方案中有DB oracle。 我想在此查询中获得一些结果。 查询示例:
select * from doctor where doctor.name like '%IVANOV_A%';
但如果我在LINQ上这样做,我就无法得到任何结果。
from p in repository.Doctor.Where(x => x.Name.ToLower().Contains(name))
select p;
其中'name'是字符串参数的变量。
网页布局请求下一个字符串:“Ivanov a”或“A Ivanov”
但我建议用户选择你的pattetn进行查询。
如果姓名包含“名字”和“姓氏”,但用户不知道医生的全名,我怎能得到“名字耐心”?
PS:我被迫使用下一个sql:
select *
from doctor
where doctor.name like '%Ivano%' and doctor.name like '%Serg%';
答案 0 :(得分:2)
你可以做到
repository.Doctor.Where(x => x.Name.Contains(name))
在linq-to-sql和linq-to-entities中,这都被转换为LIKE %...%
。您可能甚至不需要ToLower
,因为比较完全是数据库端,因此使用数据库的排序规则。您必须尝试,但默认情况下,数据库通常不区分大小写。但是如果需要,你可以使用ToLower
,它将转换为SQL。
至于名称序列问题。无论您获得什么搜索字符串,您都可以使用尾随和前导空格来查找匹配项。假设搜索字符串是“A B”。匹配应该是((如“%A%”和类似“%B%”)或(如“%A%”)和类似“%B%”)。 (Wathc的太空人物!)。您可以通过将字符串拆分为空格字符来解决此问题。
答案 1 :(得分:1)
[System.Data.Objects.DataClasses.EdmFunction("WebDataModel", "String_Like")]
public static bool Like(this string input, string pattern)
{
/* Turn "off" all regular expression related syntax in
* the pattern string. */
pattern = Regex.Escape(pattern);
/* Replace the SQL LIKE wildcard metacharacters with the
* equivalent regular expression metacharacters. */
pattern = pattern.Replace("%", ".*?").Replace("_", ".");
/* The previous call to Regex.Escape actually turned off
* too many metacharacters, i.e. those which are recognized by
* both the regular expression engine and the SQL LIKE
* statement ([...] and [^...]). Those metacharacters have
* to be manually unescaped here. */
pattern = pattern.Replace(@"\[", "[").Replace(@"\]", "]").Replace(@"\^", "^");
return Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase);
}
答案 2 :(得分:0)
试试这个,它可能有用(没有测试):
from p in repository.Doctor.Where(x => x.Name.Contains(name, StringComparer.OrdinalIgnoreCase))
select p;