2016-10-03 21 views
0

私は、複数の役割IDを含む文字列配列を持っています。私のコントローラーでは、電子メールを送信する目的で、配列内に1つ以上の役割があるユーザーのリストを返すことを望みます。だから、何かのように:model.SelectedRolesはロールIDのとj.Rolesの文字列配列であるロールのIEnumerableに文字列配列のロールが含まれているかどうかを確認するにはどうすればよいですか?

var sendto = db.Users 
      .Where(j => j.Roles.SelectMany(h => h.RoleId).Any(model.SelectedRoles)) 
      .ToList(); 

は、私はエントリのいずれかに一致していた文字列フィールドの役割のIDが含まれているMVCのアイデンティティのための役割テーブルがあります文字列配列に格納されます。

明らかに上記のクエリは機能せず、正しくありません。私はちょうどそこに何かをして、私が何をしたいのかを見せています。誰も助けることができますか?

答えて

1

をお試しください:

var sendto = db.Users 
      .Where(j => j.Roles.Select(h => h.RoleId).Intersect(model.SelectedRoles).Any()) 
      .ToList(); // Note that in your answer it was SelectMany 
+0

答えがありがとう、私はintersectメソッドを見ていますが、intellisenseでエラーを書き込んだクエリ" IEnumerable 交差の定義が含まれていません " – Rob

+0

@Rob First - ロールは列の列挙可能ですか? SelectManyをSelectに置き換えてください。私は私の答えにオプションを追加しました。 2番目 - もちろんIEnumerable にはintersectの定義が含まれています!あなたはSystem.Linqを使っていませんか? –

+0

RoleIDはMVC IDの文字列です。私はSelectManyからSelectにクエリを変更しています。答えとしてマークします、ありがとう。 – Rob

0

おそらく、交差法はあなたを助けることができる

var sendto = db.Users 
      .Where(j => model.SelectedRoles.Contains(j.Roles)) 
      .ToList(); 
+0

おかげで、あなたのクエリを好きではない、「model.SelectedRolesは、 『含む』の定義が含まれていません」 – Rob

+0

SelectedRolesプロパティのタイプは何ですか? – sachin

+0

model.SelectedRolesが文字列配列の場合、Contains – Imad

1

あなたは.Any()を使用することができます。

var sendto = db.Users 
    .Where(j => j.Roles 
     .Any(h => model.SelectedRoles.Any(i => i == h)) 
    ) 
    .ToList(); 
1

私は誰ユーザーのリストを返したいですアレイ内に1つまたは複数の役割が見つかりました

役割の

一つ以上のAnyに変換し、そして配列で見つかったContainsに変換:

var sendto = db.Users 
    .Where(user => user.Roles.Any(role => model.SelectedRoles.Contains(role.RoleId))) 
    .ToList(); 
+0

'SelectedRoles'はRole []で、RoleIdを指定することはできません。Roleオブジェクトが必要です –

+0

@MrinalKamboj OPの説明から:*モデルはどこにありますか。SelectedRolesは、ロールIDの**文字列配列**です。 –

+0

おかげで、不思議なことに、 'Id'でも' string'になります:) –

0

モデルに関する一定の仮定で、このコードをチェックしてください:

両方のIEquatableを実装しましたUserそしてあなたの答えが、インテリセンスのためRoleクラス

void Main() 
{ 
    var users = new List<User>(); 

    var selectedRoles = new Role[10]; // Supplied Role list 

    var flattenedUserRoles = users.SelectMany(u => u.Roles.Select(r => new { u,r})); 

    var finalResult = flattenedUserRoles.Where(x => selectedRoles.Contains(x.r)) 
             .GroupBy(y => y.u) 
             .Select(z => z.Key);   
} 

public class User :IEquatable<User> 
{ 
    public int UserId{ get; set;} 

    public List<Role> Roles { get; set;} 

    public bool Equals(User other) 
    { 
     return other != null && 
      UserId == other.UserId; 
    } 

    public override bool Equals(object other) 
    { 
     return Equals(other as User); 
    } 

    public override int GetHashCode() 
    { 
     return (UserId.GetHashCode() * 31); 
    } 
} 

public class Role : IEquatable<Role> 
{ 
    public int RoleId { get; set;} 

    public bool Equals(Role other) 
    { 
     return other != null && 
      RoleId == other.RoleId; 
    } 

    public override bool Equals(object other) 
    { 
     return Equals(other as Role); 
    } 

    public override int GetHashCode() 
    { 
     return (RoleId.GetHashCode() * 31); 
    } 
} 
+0

'Role'はクラスではなく単なる' String'であれば、 'Role'クラスを必要としないので簡単です –

関連する問題