Compte tenu de cette requête LINQ contre un contexte de données EF:SQL produit par Entity Framework pour faire correspondre la chaîne
var customers = data.Customers.Where(c => c.EmailDomain.StartsWith(term))
Vous vous attendez à produire SQL comme ça, non?
SELECT {cols} FROM Customers WHERE EmailDomain LIKE @term+’%’
Eh bien, en fait, il fait quelque chose comme ceci:
SELECT {cols} FROM Customer WHERE ((CAST(CHARINDEX(@term, EmailDomain) AS int)) = 1)
Savez-vous pourquoi?
En outre, le remplacement Où sélecteur:
c => c.EmailDomain.Substring(0, term.Length) == term
il fonctionne 10 fois plus rapide, mais produit encore un peu SQL assez dégueu. Linq to SQL traduit correctement StartsWith en Like {term}%, et nHibernate a une LikeExpression dédiée.
Avez-vous vu comment l'assemblage dégueu ou MSIL obtient après votre jolie LINQ ou tout bon code C# source? La question est de savoir si cela donne un résultat correct, pourquoi avons-nous besoin de déranger. –
Merci pour le conseil sur le remplacement de StartsWith avec Substring - qui a résolu mon problème avec la version de StartsWith ne correspondant pas aux chaînes vides comme préfixes. –
duplication possible de [linq à entités générées sql] (http://stackoverflow.com/questions/576803/linq-to-entities-generated-sql) – brechtvhb