2017-08-04 9 views
-1

このインサートを短くすることはできますか? foreachをスキップできるように思われる。このインサートを短くすることができます

if (users == null) 
{ 
    users = new List<User>(); 
    foreach (UserIDGroupID userIDGroupID in UserIDsGroupIDs.Where(x => x.GroupID == ID)) 
    { 
     Users.AddRange(LibraryUsers.Where(x => x.ID == userIDGroupID.UserID)); 
    } 
} 
+0

'Users.AddRange(LibraryUsers.Where(X => x.Groups.Any(グラム=> g.GroupID == ID)));'これはもちろん、あなたがナビゲーションプロパティを持っていると仮定しライブラリ利用者からグループへ。 –

+0

@RobertMcKee UserIDsGroupIDsを使用しません – Paparazzi

+0

これがポイントです。これがEF、nHibernateまたはLINQtoSQLのようなもので、LibraryUserクラスにNavigationプロパティがある場合、UserIDsGroupIDsコレクションはまったく必要なく、単一のSQLクエリを生成して、必要なものを取得します複数または複数の倍数よりもしかし、モデルクラス、データベース構造(これはデータベースに関係する場合でも)、そしてあなたのコレクションをバックアップするものを提供する必要があります。それでは、私はあなたにもっと良い答えを与えることができました。 –

答えて

3

以前のIDの選択肢にContainsを使用してみることができます。サンプルについて:

if (users == null) 
{ 
    var ids = UserIDsGroupIDs.Select(x => x.UserID); 

    users = LibraryUsers.Where(x => ids.Contains(x.Id)).ToList(); 
} 
+0

これをテストします。 – Paparazzi

+0

'IEnumerable'を' HashSet'に変換すると、 'Contains'の性能が向上するので、' LibraryUsers'の項目が 'UserIDsGroupIDs'に存在することを確認します。このチェックはO(c) –

+0

@GeorgeAlexandriaそれはSQLにlinqですか?オブジェクトにLinq私は同意する! –

関連する問題