2

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

[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 放在我所有状态值的前面?我尝试将 statusList 设为 char 列表,但随后我需要先将 Status 列的定义更改为代码中的 char,但这会引发错误。

谢谢大卫

4

1 回答 1

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,这可能会有所帮助

于 2012-10-13T20:50:01.637 回答