varchar vs nvarchar按linq排序至实体

时间:2018-10-12 20:21:30

标签: c# linq lambda sql-order-by

我有一个数据库,该数据库具有类型为varchar(200)的表“电子邮件”字段“主题”。当我在SQL中订购时:

git checkout

我得到以下结果:

  1. 100-2-00000
  2. 100000-1-00000
  3. 1007-2-00000
  4. 1007-2-00001
  5. 1007-2-00002

我有一个使用第三方网格的旧式桌面应用程序,该应用程序使用.NET的字符串比较功能,这些功能按以下顺序给出结果:

  1. 100000-1-00000
  2. 100-2-00000
  3. 1007-2-00000
  4. 1007-2-00001
  5. 1007-2-00002

我已经对差异进行了一些研究,这可能是由于使用了数据库而引起的。 .NET网格使用字符串值作为unicode,而sql不使用。

我测试了将varchar(200)字段强制转换为nvarchar(200)字段以进行排序会产生相同的结果:

git reset
  1. 100000-1-00000
  2. 100-2-00000
  3. 1007-2-00000
  4. 1007-2-00001
  5. 1007-2-00002

我正在制作一个使用LINQ来复制旧版网格中显示的电子邮件顺序的Web应用程序。用户可以动态建立网格的顺序(具有数十列)。我正在创建动态lambda表达式,以在通过多个列进行排序时通过调用创建一系列顺序。这些查询的最后一个障碍是:

是否可以复制在LINQ中创建表达式的部分select Subject from Emails order by Subject

orderby建筑的当前示例是:

select Subject from Emails order by cast(Subject as nvarchar(200))

此查询以等于order by cast(Subject as nvarchar(200))的顺序返回正确的结果。但是我希望它们能够像主题是nvarchar一样进行匹配。

我无法直接在数据库中控制排序规则,也无法将变量的类型更改为nvarchar。我正在使用的旧数据库的字段比我要排序的字段还要多。

1 个答案:

答案 0 :(得分:1)

您可以在数据库中创建一个视图,并让Linq使用该视图而不是直接表查询。例如:

create view v_emails as select cast(Subject as nvarchar) from Emails;

接下来,更新您的实体模型,以使视图可用。这样一来,您就可以按主题列以nvarchar格式进行排序,而无需更改数据库中的数据类型。