web-dev-qa-db-fra.com

Commande de linq à sql

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.

  1. Comment puis-je faire une commande en utilisant la syntaxe ci-dessus sans utiliser la syntaxe d'extension. (Je l'ai)

  2. Et que fait l'ordre, l'ordre fait?

30
Curtis White

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.

47
Mark Byers

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

8
sudhakar

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.

8
hemp

La réponse à cette question devrait être la suivante

commander par 1, 2

Je laisserai la partie # 2 à quelqu'un d'autre.

0
Curtis White