web-dev-qa-db-ja.com

LINQ-to-SQL ORDERBY THENBY

私は次のクエリ構文を使用しています

from table
where 
where
orderby 
orderby

最初のorderbyは日付で、2番目のorderbyは日付です。私はこれがorderby thenbyのように機能すると思いますが、何か他のことをしているように見えます。

  1. 拡張構文を使用せずに上記の構文を使用してorderbyを実行するにはどうすればよいですか? (とった)

  2. そして、orderby、orderbyは何をしますか?

30
Curtis White

拡張構文を使用せずに上記の構文を使用してorderbyを実行するにはどうすればよいですか?.

フィールド間にコンマを使用します。

orderby a, b

そして、orderby、orderbyは何をしますか?

行でorderbyを2回使用すると、要素は概念的に最初に最初のorderbyを使用してソートされ、次に2番目のorderbyを使用して再度ソートされます。ソートは 安定したソート (2番目のorderbyで結び付けられたオブジェクトは、最初のorderby itでソートした後と同じ順序のままになります。事実上、これは次のことを意味します。

var query = from x in l
            orderby x.A
            orderby x.B
            select x;

以下と同等です:

var query = from x in l
            orderby x.B, x.A
            select x;

その結果、orderbyの用語が、おそらく意図したものと入れ替わります。

LINQ to SQLでテストする

これは、LINQ to SQLで試して確認できます。次のクエリを作成しました。

var query = from a in dc.Orders
            orderby a.Date
            orderby a.CustomerID
            select a;

これが生成されたSQLでした:

SELECT [t0].[ID], [t0].[CustomerID], [t0].[Date], [t0].[Description]
FROM [dbo].[Order] AS [t0]
ORDER BY [t0].[CustomerID], [t0].[Date]

orderby a.Dateは無視されません。両方の用語はORDER BY句に含まれていますが、意図した順序とは逆の順序になっています。

47
Mark Byers

ThenBy演算子は、セカンダリの昇順ソート順序をシーケンスに適用します。次のようなT-SQLで2次ソート順を適用することに似ています。

Select * from Customer order by FirstName,lastName

Linqでは、これを次のように書くことができます。

var thenby = mode.CustList.Select(cus => new
        {
            cus. FirstName,
            cus. LastName,
            cus. EmailAddress
        }).OrderBy(cus => cus. FirstName).ThenBy(cus => cus. LastName);

詳細については、こちらで確認できます。 http://dotnetreaders.com/articles/ThenBy_in_LINQ_c-sharp,_Orderby_Thenby_in_LINQ_C-sharp/204

8
sudhakar

クエリ式構文 でThenByを実行するのは簡単です。最初のorderbyの後にカンマと2番目のステートメントを続けるだけです。

// 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;

標準のクエリ演算子(拡張メソッド)を使用して2番目のorderbyを適用すると、実際には2番目のorderbyが最初のorderbyを含むクエリ結果の結果に適用されます。実際には、2番目のorderbyのみが適用されますが、最初の注文の計算にはCPU時間を費やします。

実際には、Enumerable.OrderByおよびEnumerable.ThenByメソッドの MSDNドキュメント で直接回答されています。

IOrderedEnumerableはIEnumerableを継承するため、OrderBy、OrderByDescending、ThenBy、またはThenByDescendingの呼び出しの結果に対してOrderByまたはOrderByDescendingを呼び出すことができます。これを行うと、以前に確立された順序を無視する新しいプライマリ順序が導入されます。

8
hemp

Thenbyへの答えは次のようになります

orderby 1、2

パート2は他の人に任せます。

0
Curtis White