29

私はLINQ-to-SQLについて学んでおり、奇妙なことが起こるまですべてがうまくいっていました:

の例を作成しようとしたdistinctので、Northwind データベースを使用して、次のクエリを作成しました。

var query = 
    from o in db.Orders
    orderby o.CustomerID
    select new
    {
        o.CustomerID
    };

格納されているクエリに対して LINQ-to-SQL によって生成された SQL を出力すると、query次のようになります。

SELECT [t0].[CustomerID]
FROM [dbo].[Orders] AS [t0]
ORDER BY [t0].[CustomerID]

したがって、いつものように、クエリはすべてのCustomerIDfor eachOrderをアルファベット順に並べたOrdersテーブルに取り込みます。

しかし!次のような方法を使用する場合Distinct()

var query = (
    from o in db.Orders
    orderby o.CustomerID
    select new
    {
        o.CustomerID
    }).Distinct();

Distinctクエリは句の期待される結果をもたらしますが、CustomerID私が書いたにもかかわらず、sは順序付けられていませんorderby o.CustomerID!

この 2 番目の LINQ クエリの SQL クエリは次のとおりです。

SELECT DISTINCT [t0].[CustomerID]
FROM [dbo].[Orders] AS [t0]

ご覧のとおり、**ORDER BY句がありません。何故ですか?

メソッドORDER BYを使用すると句が消えるのはなぜですか?Distinct()

4

4 に答える 4

53

Queryable.Distinctのドキュメントから;

予期される動作は、ソース内の一意のアイテムの順不同のシーケンスを返すことです。

つまり、既存の IQueryable の順序は、使用すると失われますDistinct()

あなたが望むのは、おそらくこのようなもので、Distinct() が完了した後の OrderBy() です。

var query = (from o in db.Orders
             select new
             {
                 o.CustomerID
             }).Distinct().OrderBy(x => x.CustomerID);
于 2012-09-14T17:13:43.433 に答える
17

Distinct の後に OrderBy を配置するようにメンバーを再配置してみてください。メソッドチェーンに戻る必要があります。

db.Orders.Select(o=>o.CustomerId).Distinct().OrderBy(id=>id);

いずれにせよ、Enumerable Linq でクエリを設定するには、これがより効率的な方法です。これは、OrderBy がすべてのアイテムではなく、一意のアイテムに対してのみ動作するためです。また、MSDNによると、Enumerable.Distinct は要素の戻り順序を保証しないため、重複排除前の順序付けは無意味です。

于 2012-09-14T17:13:33.550 に答える
4

個別の使用により、返されるリストの順序は保証されません。LinqToSql はこれを認識できるほどスマートなので、無視します。

AFTER your Distinctまでに注文すると、すべてがあなたの望むように行われます。

var query = (from o in db.Orders
             select new
             {
                 o.CustomerID
             }).Distinct().OrderBy(o => o.CustomerID);

また

var query = db.Orders.Select(o => o.CustomerID).Distinct().OrderBy(o => o.CustomerID);

明確にするために、この記事を参照してください。

http://programminglinq.com/blogs/marcorusso/archive/2008/07/20/use-of-distinct-and-orderby-in-linq.aspx

于 2012-09-14T17:13:34.587 に答える
2

次の構造で ORDERBY と DISTINCT をシミュレートできます。

var distinctItems = employees.GroupBy(x => x.EmpID).OrderBy(x => x).Select(y => y.First());
于 2015-07-14T12:39:34.813 に答える