Sémantique Null
LINQ to SQL n'impose pas de sémantique de comparaison null sur SQL. Les opérateurs de comparaison sont traduits syntaxiquement dans leurs équivalents SQL. Pour cette raison, la sémantique reflète la sémantique SQL définie par le serveur ou les paramètres de connexion. Par exemple, deux valeurs null sont considérées comme différentes selon les paramètres SQL Server par défaut, mais vous pouvez modifier les paramètres pour changer la sémantique. LINQ to SQL ne tient pas compte des paramètres du serveur lorsqu'il traduit des requêtes.
Une comparaison avec le littéral null est traduite dans la version SQL appropriée (is null ou is not null).
La valeur null dans le classement est définie par SQL Server et LINQ to SQL ne change pas le classement.
Agrégats
La méthode d'agrégation (opérateur de requête standard) Sum prend la valeur zéro pour une séquence vide ou contenant uniquement des valeurs null. Dans LINQ to SQL, la sémantique de SQL reste inchangée et Sum prend la valeur null plutôt que la valeur zéro pour une séquence vide ou contenant uniquement des valeurs null.
Les limitations SQL sur les résultats intermédiaires s'appliquent aux agrégats dans LINQ to SQL. Le Sum de quantités d'entiers 32 bits n'est pas calculé à partir des résultats 64 bits. Un dépassement de capacité peut se produire pour une traduction LINQ to SQL de Sum, même si l'implémentation de l'opérateur de requête standard n'entraîne pas de dépassement de capacité pour la séquence en mémoire correspondante.
De même, la traduction LINQ to SQL de Average pour des valeurs entières est calculée comme un integer et non comme un double.
Arguments d'entité
LINQ to SQL permet d'utiliser des types d'entité dans les méthodes GroupBy et OrderBy. Dans la traduction de ces opérateurs, l'utilisation d'un argument d'un type est considérée comme équivalente à la spécification de tous les membres de ce type. Par exemple, le code suivant est équivalent :
db.Customers.GroupBy(Function(c) c)
db.Customers.GroupBy(Function(c) New With {c.CustomerID, _
c.ContactName})
db.Customers.GroupBy(c => c);
db.Customers.GroupBy(c => new { c.CustomerID, c.ContactName });
Arguments égaux/comparables
L'implémentation des méthodes suivantes nécessite l'égalité des arguments :
Contains
Skip<(Of <(TSource>)>)
Union
Intersect
Except
LINQ to SQL prend en charge l'égalité et la comparaison pour les arguments plats, mais pas pour les arguments qui contiennent des séquences ou correspondent à des séquences. Un argument plat est un type qui peut être mappé à une ligne SQL. Une projection d'un ou de plusieurs types d'entité qui peuvent être déterminés statiquement comme ne contenant pas de séquence est considérée comme un argument plat.
Des exemples d'arguments plats sont présentés ci-dessous :
db.Customers.Select(Function(c) c)
db.Customers.Select(Function(c) New With {c.CustomerID, c.City})
db.Orders.Select(Function(o) New With {o.OrderID, o.Customer.City})
db.Orders.Select(Function(o) New With {o.OrderID, o.Customer})
db.Customers.Select(c => c);
db.Customers.Select(c => new { c.CustomerID, c.City });
db.Orders.Select(o => new { o.OrderID, o.Customer.City });
db.Orders.Select(o => new { o.OrderID, o.Customer });
Des éléments d'arguments non plats (hiérarchiques) sont présentés ci-dessous.
' In the following line, c.Orders is a sequence.
db.Customers.Select(Function(c) New With {c.CustomerID, c.Orders})
' In the following line, the result has a sequence.
db.Customers.GroupBy(Function(c) c.City)
// In the following line, c.Orders is a sequence.
db.Customers.Select(c => new { c.CustomerID, c.Orders });
// In the following line, the result has a sequence.
db.Customers.GroupBy(c => c.City);
Traduction de fonctions Visual Basic
Les fonctions d'assistance suivantes utilisées par le compilateur Visual Basic sont traduites en opérateurs et en fonctions SQL correspondants :
CompareString
DateTime.Compare
Decimal.Compare
IIf (in Microsoft.VisualBasic.Interaction)
Méthodes de conversion :
| ToBoolean | ToSByte | ToByte | ToChar |
| ToCharArrayRankOne | ToDate | ToDecimal | ToDouble |
| ToInteger | ToUInteger | ToLong | ToULong |
| ToShort | ToUShort | ToSingle | ToString |