2011-01-18 11 views
10

エンティティGroupUserがあります。
Groupエンティティは、ユーザのリストであるUsersプロパティを持っています。
ユーザーの名前はIsEnabledです。エンティティへのLinq - 子エンティティのフィルタリング方法

UserIsEnabledが真になるGroupのリストを返すlinqクエリを作成したいとします。例えばので

、のようなデータの
AllGroups
グループA
ユーザ1(でIsEnabled =真)
ユーザ2(でIsEnabled =真)
ユーザ3(でIsEnabled =偽)

以下

グループB
ユーザ4(でIsEnabled =真)
ユーザ5(でIsEnabled =偽)
ユーザー6(でIsEnabled = false)を
私は
FilteredGroups
グループAを取得したい


ユーザー1(でIsEnabled =真)
ユーザー2(でIsEnabled =真)は

グループB
ユーザー4(IsEnabled = true)

私は次のクエリを試してみましたが、Visual Studioは
[プロパティまたはインデクサ「ユーザーが」に割り当てることはできません - それは読み取り専用です]と言われます

FilteredGroups = AllGroups.Select(g => new Group() 
        { 
         ID = g.ID, 
         Name = g.Name, 
         ... 
         Users = g.Users.Where(u => u.IsInactive == false) 
        }); 

はあなたの助けをありがとう!

+0

EF4を使用していますか?もしそうなら、POCOを使っていますか? 'Group.Users'はどのように宣言されていますか? – RPM1984

+2

これはフィルタリングされたインクルードで簡単に実現できます。この機能のために[ここ](https://entityframework.codeplex.com/workitem/47)に投票してください! – Chris

答えて

8

私は上下逆さまにクエリを回すことによって、これを行うために管理:

var users = (from user in Users.Include("Group") 
      where user.IsEnabled 
      select user).ToList().AsQueryable() 

from (user in users 
     select user.Group).Distinct() 

(ToListメソッドを使用して)あなたがそうでない遅延実行が邪魔に来るので必要とされているデータベースへの往復を強制。 2番目のクエリは、取得したデータの順序を変更します。

注:後でエンティティを迂回させることができない場合があります。

+0

このlinqクエリで私を助けることができます:http://stackoverflow.com/questions/38120664/how-to-group-by-on-2-child-entities-and-get-total-of-both-this-子エンティティ –

9

あり、これを行うのない「素敵」な方法はありませんが、あなたはこれを試みることができる - ちょうどGroupsプロジェクトの両方、Groupと匿名オブジェクトにUsersを濾過し、次いでSelect

var resultObjectList = AllGroups. 
         Select(g => new 
           { 
            GroupItem = g, 
            UserItems = g.Users.Where(u => !u.IsInactive) 
           }).ToList(); 

FilteredGroups = resultObjectList.Select(i => i.GroupItem).ToList(); 

このISNは」文書化された機能であり、EFがSQLクエリを構成する方法と関係しています。この場合、子コレクションをフィルタリングする必要があります。FilteredGroupsリストにはアクティブユーザーのみが含まれます。

これが動作する場合、あなたはコードをマージしようとすることができます

FilteredGroups = AllGroups. 
       Select(g => new 
           { 
            GroupItem = g, 
            UserItems = g.Users.Where(u => !u.IsInactive) 
           }). 
       Select(r => r.GroupItem). 
       ToList(); 

(これは未テストで、結果はEFが第二Selectを処理する方法に依存するため、あなたは私たちがどの知っている場合、それはいいだろうメソッドはあなたがそれを試した後に動作します)。

1

はこのような何かを試してみて、あなたはまだ実体があるでしょう:

FilteredGroups = AllGroups.Select(g => new 
{ 
    Group = g, 
    Users = g.Users.Where(u => u.IsInactive == false) 
}).AsEnumerable().Select(i => i.Group); 

あなたはまだあなたがあなたのエンティティの構造を保持したい場合は、これを試してGroup.Users

0

を使用することができるはずですその方法:

var userGroups = context.Users.Where(u => !u.IsInactive).GroupBy(u => u.Group); 

foreach (var userGroup in userGroups) 
{ 
    // Do group stuff, e.g.: 
    foreach (var user in userGroup) 
    { 
    } 
} 

エンティティを変更することもできます。

関連する問題