J'utilise la syntaxe de requête suivante
from table
where
where
orderby
orderby
Où le premier ordre est une date et le second ordre est une date. Je suppose que cela fonctionnerait comme dans l'ordre, mais semble faire autre chose.
Comment puis-je faire une commande en utilisant la syntaxe ci-dessus sans utiliser la syntaxe d'extension. (Je l'ai)
Et que fait l'ordre, l'ordre fait?
Comment puis-je faire une commande en utilisant la syntaxe ci-dessus sans utiliser la syntaxe d'extension.
Utilisez une virgule entre les champs:
orderby a, b
Et que fait l'ordre, l'ordre fait?
Lorsque vous utilisez orderby
deux fois de suite, les éléments seront conceptuellement triés à l'aide du premier orderby
, puis triés à nouveau à l'aide du second orderby
. Parce que le tri est défini comme étant tri stable (les objets qui sont liés avec le second orderby
resteront dans le même ordre qu'après le tri avec le premier orderby
it signifie effectivement que ceci:
var query = from x in l
orderby x.A
orderby x.B
select x;
est équivalent à:
var query = from x in l
orderby x.B, x.A
select x;
Le résultat est que les termes orderby
sont échangés de ce que vous vouliez probablement.
Test avec LINQ to SQL
Cela peut être vérifié en l'essayant dans LINQ to SQL. J'ai créé la requête suivante:
var query = from a in dc.Orders
orderby a.Date
orderby a.CustomerID
select a;
et ce fut le SQL généré:
SELECT [t0].[ID], [t0].[CustomerID], [t0].[Date], [t0].[Description]
FROM [dbo].[Order] AS [t0]
ORDER BY [t0].[CustomerID], [t0].[Date]
Notez que le orderby a.Date
n'est pas ignoré. Les deux termes sont inclus dans la clause ORDER BY, mais dans l'ordre inverse de ce que vous auriez pu imaginer.
L'opérateur ThenBy
applique un ordre de tri secondaire ascendant à la séquence. Cela revient à appliquer un ordre de tri secondaire en T-SQL comme:
Select * from Customer order by FirstName,lastName
Dans linq, nous pouvons écrire ceci comme:
var thenby = mode.CustList.Select(cus => new
{
cus. FirstName,
cus. LastName,
cus. EmailAddress
}).OrderBy(cus => cus. FirstName).ThenBy(cus => cus. LastName);
Vous pouvez en savoir plus à ce sujet ici: http://dotnetreaders.com/articles/ThenBy_in_LINQ_c-sharp,_Orderby_Thenby_in_LINQ_C-sharp/204
Effectuer un ThenBy dans Syntaxe d'expression de requête est simple, suivez simplement l'ordre initial avec une virgule et une 2ème instruction:
// Create the data source.
List<Student> students = GetStudents();
// Create the query.
IEnumerable<Student> sortedStudents =
from student in students
orderby student.Last ascending, student.First ascending
select student;
L'application d'un second ordre à l'aide des opérateurs de requête standard (méthodes d'extension) appliquera en fait le deuxième ordre au résultat du résultat de la requête qui inclut le premier ordre. En effet, seul le second ordre s'applique, bien que vous passiez toujours du temps CPU à calculer le premier ordre.
Ceci est en fait répondu directement dans la documentation MSDN pour les méthodes Enumerable.OrderBy et Enumerable.ThenBy.
Étant donné que IOrderedEnumerable hérite d'IEnumerable, vous pouvez appeler OrderBy ou OrderByDescending sur les résultats d'un appel à OrderBy, OrderByDescending, ThenBy ou ThenByDescending. Cette opération introduit un nouvel ordre principal qui ignore l'ordre précédemment établi.
La réponse à cette question devrait être la suivante
commander par 1, 2
Je laisserai la partie # 2 à quelqu'un d'autre.