2016-10-06 53 views
0

タイトルには次のように記載されています。 IDを持つジョブがあるページがあります。このIDをセッションに保存していて、会社のプロファイルにアクセスしようとしているときに、テーブルからジョブIDを持つセッション変数がジョブであるかどうかをテストしてから、ユーザーIDを選択してからこのユーザーIDで検索しますUserManagerでいくつかのデータをページに取り込もうとします。セッションとLINQを使用して自分のジョブからユーザーのプロファイルIDを取得する

コードについては会社概要:このコントローラの

public async Task<ActionResult> Details(string id) 
    { 
     String JobValID = Convert.ToString(Session["DetailsURL"]); 

     var UserJobID = context.Jobs.Where(x => x.ID.ToString() == JobValID).OrderByDescending(x => x.UserID).Select(x => x).ToString(); 
     UserJobID = id; //This line is to see what value I got from LINQ and is still the Session value. 

     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

     var user = await UserManager.FindByIdAsync(id); 
     return View(user); 

     } 

ビューは、コントローラからデフォルト足場図です。

そして、このように私はSession["DetailsURL"]

var currentID = Url.RequestContext.RouteData.Values["id"];   
Session["DetailsURL"] = currentID; 

を取得し、私は、これがユーザープロファイルページを取得するための標準的な方法ではありませんね。しかし、私は会社のプロフィールに入るためにジョブページからActionLinkを使用しています。会社概要へJobPageから取得する。ここ

ActionLink

@Html.ActionLink("About this company", "Details", "UserAdmin", new { id = Session["UserJobID"] }, null) 

私の問題は、私はユーザーIDを選択しようとしているとき、それは正しい値を取得していない、と私は探していたときに、LINQ文ですUserManagerでは値はまだsessionの値です。

Found the solution here だから私はそれをやった方法:

var UserJobId = (from c in context.Jobs 
        where c.ID == JobValID 
        select new { c.UserID }).Single(); 

    var myVal = UserJobId.UserID; 
    id = myVal; 
+0

あなたのlinq文が私を混乱させています。コレクションで 'ToString()'を呼び出すのはなぜですか? 'Select(x => x)'の使い方は? – Shyju

+0

私は 'ToString'を単に文字列idの型とマッチさせるために、私のUserManagerは' string'を要求します。そして、最初は 'OrderByDescending(x => x.UserID).Select(x => x)'はなく、値は同じです。 – Eduard

+1

私は 'OrderByDescending(x => x.UserID).Select(x => x)'ができないことを期待しているように感じます。 'Single'ユーザIDを取得しようとしていますか? – czifro

答えて

0

私はC#]を使用しているので、それはしばらくの間でしたが、あなたのLINQ文はJobオブジェクトのリストを取得し、リスト上のToStringをやっているようです。 Jobは、それに関連付けられたUserIdへの参照を持っている場合は、次のLINQ文は動作するはずです:

var userId = context.Jobs 
        .SingleOrDefault(x => x.ID.ToString() == jobId) 
        .?Select(j => j.<accessorToUserId>) // Not sure what your schema is 
        .?ToString() 

お知らせ?SingleOrDefaultがnullを返した場合、次のメソッド呼び出しは行われません。何らかの理由で1つ以上のJobjobIdを使用している場合は、実際には悪い方法ですが、SingleOrDefaultFirstOrDefaultに置き換えてください。

また、Selectは、タイプTからタイプUにマップするために使用されることになっています。あなたが単にT -> Tをやっているので、Select(x => x)を行うことは意味がありません。

+0

インスピレーションを受けてくれてありがとうございました。でも、私は別のアプローチでそれをやりました。 [http:// stackoverflow。com/questions/6015081/c-sharp-linq-how-to-retrieve-a-single-result](ここにあります)。 「Single」とのあなたの提案は、私を適切な場所で検索させました。私はそれをどのように編集します。 – Eduard

+0

私は彼らが同じだと思うが、私は助けることができてうれしい – czifro

関連する問題