У меня есть только одна таблица, сопоставленная в текстовом формате. Вот свойство и атрибут интересующей колонки:
[Column(Storage="_CustomerNumber", DbType="VarChar(25)")]
public string CustomerNumber
{
Этот столбец фактически является varchar (25) и имеет индекс.
У меня есть простой код:
DataClasses1DataContext myDC = new DataClasses1DataContext();
myDC.Log = Console.Out;
List<string> myList = new List<string>() { "111", "222", "333" };
myDC.Customers
.Where(c => myList.Contains(c.CustomerNumber))
.ToList();
, который генерирует этот текст SQL:
SELECT [t0].[CustomerNumber], [t0].[CustomerName]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[CustomerNumber] IN (@p0, @p1, @p2)
-- @p0: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [111]
-- @p1: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [222]
-- @p2: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [333]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8
Обратите внимание, что параметры являются nvarchar!
Когда этот запрос попадает в базу данных, он генерирует ужасный план, который включает преобразование многомиллионного индекса строки в CustomerNumber в nvarchar перед поиском в нем.
Мне не разрешено менять таблицу, но я могу изменить запрос и dbml. Что я могу сделать, чтобы получить данные без преобразования индекса?