Linq喜欢或其他建筑

时间:2012-11-23 10:48:35

标签: c# sql linq oracle sql-like

我的解决方案中有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%';

3 个答案:

答案 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);
}

Link - this answer(warning - russian).

答案 2 :(得分:0)

试试这个,它可能有用(没有测试):

from p in repository.Doctor.Where(x => x.Name.Contains(name, StringComparer.OrdinalIgnoreCase))
select p;