2012-03-16 13 views
0

私はUserオブジェクトのリストが含まれていTicketクラスを持っている:LINQ Enumerableで列挙可能 - なぜですか?

class Ticket { 
    public List<User> Users { get; set; } 
} 

私がチケットに関連するすべてのユーザーを取得したいです。私はこれを行う:

動作しますが、1つの要素と Enumerableを返し
var u = from t in db.Tickets 
     where t.Users.Count() > 0 
     select t.Users 

。その要素は、ユーザーがEnumerableです。

なぜそれがネストされていますか?

+0

私の投稿を参照してください。しかし、 'Count()> 0の代わりに' Any() 'を使用してください。 –

答えて

4

はその後、平坦化

var u = (from t in db.Tickets from user in t.Users select user).ToList(); 

を持つことになりますされ私たちのリストers。 where t.Users.Count() > 0を確認する必要はありません。必要があれば、t.Users.Any()を効率的に使用する必要があります。

+1

2つの 'from'は' SelectMany() 'に変換されるので、これは他の解決策のいくつかと同等です。 –

+0

はい、ありがとう、ありがとう。私はあなたの評価に基づいて追加のブラウニーポイントのために両方の方法を入れなければなりません:-) – Phil

+1

、私はあなたがそれを知っていたと確信していました:)それは他の読者への単なるメモでした。 –

1

すべてのt.Users(t0.Users、t1.Users ...)を1つのリストにマージしないためです。それらを組み合わせる必要があります。

-1

最初に:LINQ-Queryは常に列挙可能な値を返します。

第2:あなたのt.UsersはIEnumerableも実装するListです。 デシベル:

だから外側の列挙は、LINQの結果セットと

var u = from t in db.Tickets 
     where t.Users.Count() > 0 
     select (t.Users as List<User) 
+0

Enumerableを返さないFirstOrDefault()についてはどうですか? – Lloyd

+0

結果セット(Enumerable)の最初のObjectまたは結果セットが空の場合は、正しいタイプのデフォルトオブジェクトを返します。 –

+0

IEnumerable (具体的にはEnumerableオブジェクトではありません)からFirst TSourceを返します。MSDN http:// msdn。 microsoft.com/en-us/library/bb340482.aspx – Lloyd

1

あなたはこのようにIEnumerableをにそれをマージすることができますようにユーザーのリストにキャストバックすることができます内側の実際の最初の結果です。あなたがする必要がどのようなTickets.Where(トン=> t.Users.Count()> 0).SelectMany(トン=> t.Users)

4

あなたはList<User>IEnumerable<Users>を選択するので...

第二可算あなたは次のクエリでそれを平らにすることができますList<User>

です。

db.Tickets.Where(t => t.Users.Any()).SelectMany(t => t.Users) 

Any()それが最初の出現でcouting停止しますので、Count() > 0よりもはるかに高速で、ユーザーの完全なリストに反復カウントあなたは

1

を持っている私はあなたが

var u = (from t in db.Tickets 
     from u in t.Users 
     select u).Distinct(); 
0

を探していると思いますクエリから私はあなたがチケットのすべてのユーザーを持ってほしいと思うsupose。

あなたはこのようにこの問題を解決することができます。

List<User> users = new List<User>(); 

foreach(List<user> u in db.Tickets.where(ticket => ticktet.Users.Count() > 0).select(ticket => ticket.Users)){ 
users.AddAll(u); 
}    
0

SelectManyメソッドは、あなたが望むものです。

"シーケンスの各要素をIEnumerable(Of T)に投影し、結果のシーケンスを1つのシーケンスに平坦化します。"

したがって、すべてのチケットを取得して各チケットのすべてのユーザーを取得すると、結果のリストはユーザーのリストになります。また、重複ユーザーを削除するためにDistinctメソッドを使用することもできます。

関連する問題