使用contains查找char(1)数据类型时的慢linq查询

时间:2012-10-13 11:26:11

标签: entity-framework char contains

我有一个带有char(1)状态列的旧数据库。我首先使用代码和实体框架4.3.1与我的数据库进行交互。我的代码第一类中的My Status列定义如下:

[Column(TypeName = "char")]
public string Status { get; set; }

我正在编写一个linq查询来获取状态为多个值之一的所有项目。代码看起来像这样(虽然它已被简化):

List<string> statusList = new List<string>() {"N","H","P"};
...
var entries = (from t in context.MyTable where statusList.Conains(t.Status)).ToList();
...

生成的SQL为所有Status值前缀为N,使查询速度很慢。

WHERE ([Extent1].[Status] IN (N'N', N'P', N'P'))

这似乎是因为它将unicode与非unicode进行比较,因此它无法使用Status列上的索引。

我之前在其他linq查询中遇到过类似的问题,但我认为它们是通过在属性上放置[Column(TypeName =“char”)]来解决的。

有谁知道我如何防止SQL将这些N放在我的所有Status值之前?我尝试使statusList成为char的列表,但后来我需要先在代码中将Status列的定义更改为char,但这会引发错误。

由于 大卫

1 个答案:

答案 0 :(得分:1)

您使用的是.NET Framework 4吗?我认为这是在.NET Framework 4.5附带的EF5核心库中修复的。这是一个连接错误:http://connect.microsoft.com/VisualStudio/feedback/details/709906/entity-framework-linq-provider-defaulting-to-unicode-when-translating-string-contains-to-like-clause连接错误还包含一个解决方法 - 使用EntityFunctions.AsNonUnicode()函数强制字符串不是Unicode,如果你不能移动到.NET Framework 4.5可能会有所帮助