2017-08-09 4 views
0

Linqクエリでナビゲーションプロパティを使用しようとしましたが、結果が得られませんでした。理由は分かりません。ナビゲーションプロパティでLinqを使用する

SQL ServerのEntity Frameworkで標準のシンプルメンバーシップテーブルを使用しています。そこで私は3つのテーブル、AspNetUsers、AspNetRoles、AspNetUserRolesを私のモデルに入れました(下の写真参照)

はい、私はこの役割クエリは、これらのテーブルは使いやすいです

とにかく、私の目標は、ナビゲーションプロパティを使用して特定のユーザーの役割を取得することでした。 AspNetUserRolesは、プライマリキーがないため、エンティティとしてモデルに組み込まれないため、これは適切な方法に見えました。私は、ここで紹介するの提案を使用してみました:

Linq to entities navigation properties

次のLINQクエリは0結果

var result = (from r in context.AspNetRoles 
     where r.AspNetUsers.Any(u => u.Id == UserId) 
     select r).ToList(); 
return result; 

思想、多分私はこれを試してみましたので、含める拡張子を使用するために必要な、また0の結果を返しますが返されます

var result = (from r in context.AspNetRoles 
      where r.AspNetUsers.Any(u => u.Id == UserId) 
      select r).Include("AspNetUsers").ToList(); 
return result; 

私はラインで何か問題があることを知っています:

where r.AspNetUsers.Any(u => u.Id == UserId) 

私はそれを削除すると結果は得られますが、特定のユーザーのためには得られません。

私はここで答えの一つに与えられたアドバイスに従うしようとしています:

任意のアイデア?

ありがとうございます!

+0

あなたが実際にやろうとしていますか?いくつかの文脈、好ましくは1つまたは2つのサンプルモデルを与える。 – stybl

+0

@styblは、質問を編集しました。私はそれが明確になるのを助けることを望む。ありがとう! – xgp

答えて

0

私が正しく理解していれば、あなたは自分のIDに基づいてユーザーの役割のすべてを取得したいです。

あなたのユーザーモデルに関する情報が不足している場合を除き、AspNetUserRolesにアクセスすることなくこれを取得することはできません。

あなたがそのテーブルにアクセスできる場合、これは本当に簡単な次のようになります。

var result = AspNetUserRoles.Where(role => role.UserId == UserId) 
    .Select(userRole => AspNetRoles.First(role => role.Id == userRole.RoleId)); 

またはクエリ構文で:

var result = from userRole in AspNetUserRoles 
      where userRole.UserId == UserId 
      from role in AspNetRoles 
      where role.Id == userRole.RoleId 
      select role; 
+0

クエリの問題点は、.edmxダイアグラムにAspNetUserRolesを含めても、プライマリキーがないためクエリ可能なエンティティとしてインポートされないため、AspNetUserとAspNetRolesの間にナビゲーションプロパティを設定できることです。私がテーブルを選択したときにそれを含めたとしても、EFモデルにAspNetUserRolesエンティティはありません。私が理解しているように、これはEFの仕組みです。思考? – xgp

関連する問題