使用会话和LINQ

时间:2016-10-06 00:55:20

标签: asp.net-mvc linq session

正如标题所说。我有一个带有ID的Job页面。我在会话中存储此ID,当我尝试访问公司配置文件时,我只测试表Job中是否有带有作业ID的会话变量然后我尝试选择用户ID然后使用此用户ID搜索在UserManager中,尝试使用一些数据填充页面。

公司简介代码:

    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);

      }

View对于此Controller是默认的scaffolded View from controller。

就像这样我得到Session["DetailsURL"]

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

我想这不是获取用户个人资料页面的标准方法。但我使用Job Page的ActionLink进入公司简介。

此处ActionLink从JobPage到公司资料:

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

我的问题出在LINQ语句中,当我尝试选择UserID时,它没有获得正确的值,当我在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;

1 个答案:

答案 0 :(得分: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的情况下,则不会发生以下方法调用。如果出于某种原因,多个Job使用jobId,这是非常糟糕的做法,请将SingleOrDefault替换为FirstOrDefault

此外,Select应该用于从类型T映射到类型U。执行Select(x => x)毫无意义,因为您只是在执行T -> T