J'ai une seule table mappée dans un datacontext. Voici la propriété et l'attribut sur la colonne d'intérêt:LinqToSql .Contains et nvarchar vs paramètres varchar -> plan de conversion d'index
[Column(Storage="_CustomerNumber", DbType="VarChar(25)")]
public string CustomerNumber
{
Cette colonne est, en fait, un varchar (25) et a un indice.
J'ai un code simple:
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();
qui génère ce texte 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
Notez que les paramaters sont nvarchar! Lorsque cette requête atteint la base de données, elle génère un plan horrible qui implique convertir l'index de plusieurs millions de lignes sur CustomerNumber en nvarchar avant de rechercher en son sein.
Je ne suis pas autorisé à changer la table, mais je peux changer la requête et le dbml. Que puis-je faire pour extraire les données sans obtenir cette conversion d'index?
Cela fonctionne, mais il y a une chasse aux sorcières: la méthode .Translate ne se charge pas correctement les entités liées à T. (En d'autres termes, si vous avez ajouté .LoadsWith sur votre contexte, et l'autre est lié à T, alors cela échouera). –
dkr88