2016-06-22 3 views
0

私はlinqを初めて使用しており、従業員テーブルのスーパーバイザー名を表示するクエリを使用したいと考えています。テーブルの構造は次のとおりです。Linqクエリが内部で別のクエリを使用して動作していません

Users(
Id int, 
usrFirstName nvarchar(20), 
usrLastName nvarchar(20), 
usrSupervisor int 
) 

私のLINQクエリ:あなたが見ることができるように

 User userData = (User)Session["user"]; 
     var db = new scaleDBEntities(); 
     return this.Json((from userObj in db.Users 
          where userObj.Id.Equals(from idObj in db.Users 
                where idObj.Id.Equals(userData.Id) 
                select idObj.usrSupervisor) 
          select new 
          { 
           supervisorId = userObj.Id, 
           supervisorfName = userObj.usrFirstName, 
           supervisorlName = userObj.usrLastName,         
          }) 
          , JsonRequestBehavior.AllowGet 
         ); 

、現在のユーザーIDは、セッション変数に格納し、スーパーバイザ名を検索するためのクエリーで使用されています。

さて、このクエリが動作していない...具体的には、問題は内部のクエリであるので、私はそれが

 User userData = (User)Session["user"]; 
     var db = new scaleDBEntities(); 
     return this.Json((from userObj in db.Users 
          where userObj.Id.Equals(1) 
          select new 
          { 
           supervisorId = userObj.Id, 
           supervisorfName = userObj.usrFirstName, 
           supervisorlName = userObj.usrLastName,         
          }) 
          , JsonRequestBehavior.AllowGet 
         ); 
+0

あなたはuserData.Idが(正しい)データが含まれていることを確認していますか? – failedprogramming

+0

はい、userData.Idに正しいデータがあります –

答えて

1

申し訳ありませんが、私は通常クエリ構文を使用しないため、代わりにメソッド構文でコードを書きました。 問題を簡単に見つけるために、プロセスを少しずつ分けました。 以下のコードを試してみて間違いがないかどうか確認できますか?

User userData = (User)Session["user"]; 
var db = new scaleDBEntities(); 

// grab user object 
var usr = db.Users.FirstOrDefault(u => u.Id == userData.Id); 
if(usr == null) throw new Exception("Can't find user!"); 

// grab supervisor object 
var superid = usr.usrSupervisor; 
var supervisor = db.Users.FirstOrDefault(s => s.Id == superid); 
if(supervisor == null) throw new Exception("Can't find supervisor"); 

return this.Json(new { supervisorId = supervisor.Id, 
         supervisorfName = supervisor.usrFirstName, 
         supervisorlName = supervisor.usrLastName,} 
        , JSonRequestBehavior.AllowGet); 

編集

代わりにクエリを使用して整数としてスーパーバイザIDをつかむために、

var superid = db.Users.Where(u => u.Id = userData.Id) 
         .Select(u => u.usrSupervisor) 
         .FirstOrDefault(); 
+0

私はあなたが答えを構造化した方法が好きですが、これを使用して結果はありません。繰り返しますが、私は自分のコードを再試したので、userData.Idにデータがあることを確信していますが、クエリー内のクエリーの代わりにuserData.Idを入れて結果を得ました。 –

+0

userData.idの代わりにusrSupervisorの値を使用しようとしましたか?すなわち、userSupervisor = 3のユーザ(idが1)の場合、実際にはこのテーブルにid 3のユーザが存在しますか? – failedprogramming

+0

はい、スーパーバイザー3がいる場合は、ユーザーID 3があることを意味します。私の問題は、LinSのusrSupervisorを取得する必要がある部分にあります...そのようには機能しません。だから、私は別のクエリでそれを分離しようとするが、あなたは整数にlinqの結果を変換する方法を知っていますか? –

0

働くランダムIDを表す数だけでクエリを交換したときにUsersにFKがある場合は、スーパーバイザにナビゲーションプロパティ(Userと表示される可能性があります)が必要です。

User userData = (User)Session["user"]; 
    var db = new scaleDBEntities(); 
    return this.Json((from userObj in db.Users 
         where userObj.Id.Equals(userData.Id) 
         select new 
         { 
          supervisorId = userObj.User.Id, 
          supervisorfName = userObj.User.usrFirstName, 
          supervisorlName = userObj.User.usrLastName,         
         }) 
         , JsonRequestBehavior.AllowGet 
        ); 
+0

どこにこのプロパティがありますか?申し訳ありませんが私はこれに新しいです –

関連する問題