2

IQueryableの文字列変換に問題があります。IQueryableを文字列[]に変換するときにNotSupportedExceptionが発生する

public string[] GetRolesForUser(User user) 
    { 
     if (!UserExists(user)) 
      throw new ArgumentException(MissingUser); 

     var qry = from x in entities.Roles 
       where x.Users.Contains(user) 
       select x.RoleName; 

     return qry.ToArray(); // At this point I've got a NotSupportedException 
    } 

例外メッセージ:

タイプ 'SchoolMS.Models.Entities.User' の一定値を作成できません。このコンテキストでは、プリミティブ型( 'Int32、String、およびGuid'など)のみがサポートされています。

どうすれば解決できますか?正しい方法は何ですか?

(私はmvc3とEF 4.1を使用しています)

+0

問題は 'x.Users.Contains()'にあると思います。 'x.Users == user'は動くでしょうか? –

+0

私はそれを試みたが、私は同じ例外がある – mrtn

答えて

0

問題を解決しました。

私は(UsersInRoles表がそれを提供します)私のユーザーとロールの間に多くの関係に多くを使用しています、私のクエリは、この

には適していませんでした理由、それはだ、私は私のメソッド内のクエリを変更し、それがです

public string[] GetRolesForUser(User user) 
{ 
    if (!UserExists(user)) 
     throw new ArgumentException(MissingUser); 

    var qry = entities.Users 
     .Where(u => u.UserID == user.UserID) 
     .SelectMany(x => x.Roles.Select(r => r.RoleName)); 

    return qry.ToArray(); 
} 
1

私はこの問題は、エンティティフレームワークは、クエリでuser変数の定数を作成することができないということである疑いがあります。一つの解決策は、手動での参加ではなくContainsを使用し作成することができます

var qry = from x in entities.Roles 
      join Users u on u.RoleId = x.Id 
      where u.Id = user.Id 
      select x.RoleName 
0

私が要求したとして、それは、プリミティブ型になりますので

var qry = from x in entities.Roles 
    where x.Users.Select(u => u.Id).Contains(user.Id) 
    select x.RoleName; 

を書くことを検討します。

関連する問題