2

我的解决方案中有数据库预言机。我想在这个查询中得到一些结果。查询示例:

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”

但我建议用户选择您的模式进行查询。

如果名称由“名字”和“姓氏”组成但用户不知道您的医生的全名,我如何获得“患者姓名”?

PS:我强制使用下一个 sql:

select * 
from doctor
where doctor.name like '%Ivano%' and doctor.name like '%Serg%';
4

3 回答 3

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 空格字符!)。您可以通过在空格字符处拆分字符串来解决此问题。

于 2012-11-23T12:10:22.707 回答
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);
}

链接 - 这个答案(警告 - 俄语)。

于 2013-02-14T10:47:25.523 回答
0

试试这个,它可能会工作(没有测试过):

from p in repository.Doctor.Where(x => x.Name.Contains(name, StringComparer.OrdinalIgnoreCase))
select p;
于 2012-11-23T11:20:37.860 回答