【问题标题】:Compare Greek (or other non-latin) strings in linq比较 linq 中的希腊语(或其他非拉丁语)字符串
【发布时间】:2012-12-07 12:47:22
【问题描述】:

我正在尝试在 linq 中编写一个返回如下结果的查询:

PeopleEntities pe = new PeopleEntities();
String fName = "Τάκης";
var people = pe.Person.Where(per => per.FirstName.Equals(fname)).ToList();

当我使用

转储查询时
String query = ((ObjectQuery)pe.Person.Where(per => per.FirstName.Equals(fname))).ToTraceString();
Console.WriteLine(query);

然后在 MySQL WorkBench 中使用查询提供一个值,一切正常,但在代码中查询不返回任何内容。

编辑:我使用 MySQL 连接器连接了实体管理器。我之前没有考虑过,但这就是问题,因为使用 MsSQL 连接一切正常

关于如何执行上述操作的任何想法?

【问题讨论】:

  • 这个var people = (ObjectQuery)pe.Person.Where(per => per.FirstName.Equals(fname)).ToList();怎么样。工作正常吗?
  • == 代替 Equals 怎么样?也不行?
  • 将列表转换为 ObjectQuery 会有什么帮助?甚至是不允许的。
  • 我用不同的对象尝试了相同的代码,它运行正常
  • Seddik,当字母表是基于拉丁语的语言时,它运行良好,而不是希腊语。你是这样执行代码的吗?

标签: c# linq entitymanager


【解决方案1】:

在区域敏感的查询中,您不应在未提供 StringComparison 值的情况下使用 string.Equals(),例如:

var people = pe.Person.Where(
    per => per.FirstName.Equals(fname, StringComparison.CurrentCultureIgnoreCase));

是的,L2E 支持这种重载。

如果这仍然不起作用,则可能是 AppDomain 的当前区域性或 DB 的排序规则有误。查看 SQL Profiler 中的查询/参数。

【讨论】:

  • 不,这也不起作用。我的意思是它确实编译但它不返回任何东西。
  • 我还检查了排序规则,它是用希腊语设置的。如果排序规则错误,它将无法在其他语言(例如 php)中工作(确实如此)
  • 阅读帖子的其余部分。您需要查看实际的 SQL 并查看哪个部分不正确。为 LINQ 指定文化是正确的做法。至于您遇到的其他问题的位置,我无法从您在帖子中所写的内容中推断出它们。您的 LINQ 只是这个链条的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
相关资源
最近更新 更多