LINQでSELECT UNIQUEを実行するにはどうすればよいですか?


96

私はこのようなリストを持っています:

Red
Red
Brown
Yellow
Green
Green
Brown
Red
Orange

LINQでSELECT UNIQUEを実行しようとしています。つまり、

Red
Brown
Yellow
Green
Orange

var uniqueColors = from dbo in database.MainTable
                   where dbo.Property == true
                   select dbo.Color.Name;

次にこれを

var uniqueColors = from dbo in database.MainTable
                   where dbo.Property == true
                   select dbo.Color.Name.Distinct();

成功しませんでした。最初のものselectはすべての色を取得するので、一意の値のみを取得するように変更するにはどうすればよいですか?

このクエリを構造化するより良い方法がある場合は、そのルートに進んで満足してください。

.OrderBy( "列名")を使用できるように編集するにはどうすればよいですか。

私はメッセージを受け取り続けます:

型引数は、使用法から推測できません。型引数を明示的に指定してみてください。

回答:


159

Distinct()は順序をめちゃくちゃにするので、その後でソートする必要があります。

var uniqueColors = 
               (from dbo in database.MainTable 
                 where dbo.Property == true 
                 select dbo.Color.Name).Distinct().OrderBy(name=>name);

3
ありがとう、これが正解です。誰かが.OrderBy()パラメータの内容を説明できますか?あなたはname => nameを持っています。その名前はDBの列名に由来していますか?それで私にdbo.Color.Nameはちょうどname=>name私にどのヒントがあるので、それは列名ではありませんか?私はちょうどそれに変更した場合は奇妙な、それはまた、適切にソート.OrderBy(a=>a)
男爵

3
変数の名前は関係ありません。それは単に{関数に渡されるオブジェクト} => {ソートに使用されるオブジェクト}です。既にSelectを実行しているため、コレクション内でソートされるのは名前だけです。
James Curran 2010

@JamesCurranに感謝します。あなたの解決策は私をとても助けてくれました。
Ron

オブジェクト/レコード全体で順序付けするためのOrderedBy()があったらいいと思います。拡張メソッドは、理由もなくデリゲートを呼び出します。
NetMage 2016

@NetMage-「オブジェクト/レコード全体」の意味を明確にします。すべてのフィールド?どんな順番で?主キーを含みますか?
James Curran

20
var uniqueColors = (from dbo in database.MainTable 
                    where dbo.Property == true
                    select dbo.Color.Name).Distinct();

10

クエリ内包構文を使用すると、次のようにorderbyを実現できます。

var uniqueColors = (from dbo in database.MainTable
                    where dbo.Property
                    orderby dbo.Color.Name ascending
                    select dbo.Color.Name).Distinct();

うーん...それはアルファベット順のソートを実現しませんでした-何らかの理由で...私は昇順と降順を切り替えて同じ結果を得ました。明確な声明はそれに影響を与えていますか?多分それはその後にorderedbyする必要がありますか?
男爵

var uniqueColors =からの結果を試すことができます(database.MainTableのdboから、dbo.Propertyはdbo.Color.Nameを選択します)。
Cordialgermは
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.