如何使用session将LINQ Query结果发送到另一个页面?

时间:2016-01-27 22:07:45

标签: c# linq session

我看过How to convert query result to list.但它不起作用,或者我不知道如何在我的情况下使用它。

我的方案是当用户编写电子邮件和密码时,我有登录页面,应用程序根据电子邮件和密码获取数据。

protected void lbtnSignIn_Click(object sender, EventArgs e)
{
    try
    {
         SiteDataContext dc = new SiteDataContext();
         Session["UserData"] = from data in dc.Users
                                  where data.Email.Equals(txtEmail.Text.ToString()) &&
                                      data.Password.Equals(txtPassword.Text.ToString())
                                  select data; 
        Response.Redirect("SignIn.aspx");
    }
    catch(Exception exp)
    {
         lblMessage.Visible = true;
         lblMessage.Text = exp.Message;
    }
}

我在Session["UserData"]中保存了LINQ查询结果并重定向到另一个页面。在第二页,我想获得会话结果并在页面上显示用户数据。

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
    {
        var data = Session["UserData"];
        lblName.Text = data.Name;
    }
}

我无法从对象数据中获取数据。它给我以下错误

  

对象不包含'名称'的定义没有延伸   方法'名称'接受类型'对象'的第一个参数。可能   发现(您是否缺少指令或程序集引用?)

我想在另一个网页上显示登录用户的数据。请帮忙。

2 个答案:

答案 0 :(得分:2)

您在Session中存储的内容被输入为Object。您需要通过将列表转换为正确的类型来告诉它您期望的类型,从而帮助编译器。 linq查询还返回一个用户列表,因此在列表上调用.Name是没有意义的。 假设dc.Users包含一个名为User的对象列表 您可以使用以下内容来检索列表。

var data = (IEnumerable<User>)Session["UserData"];

然后可以使用

迭代数据
foreach(var u in data) System.Console.WriteLine(u.Name);

然而,看看代码,我猜你真正想要做的更像是。

您希望将您找到的FIRST用户存储在会话变量中。 然后你需要将linq代码更改为。

Session["UserData"] = (from data in dc.Users
                                  where data.Email.Equals(txtEmail.Text.ToString()) &&
                                  data.Password.Equals(txtPassword.Text.ToString())
                                  select data).FirstOrDefault(); 

从会话中检索并使用

将名称写入标签
var data = (User)Session["UserData"];
lblName.Text = data.Name;

答案 1 :(得分:1)

您应该在存储到会话之前执行查询。 请考虑使用HttpContext.Items。物品将持续一个请求。 膨胀会议并不好。

您可以使用.ToList()或甚至.FirstOrDefault()执行查询,具体取决于结果。

Session["UserData"] = (from data in dc.Users
                       where data.Email.Equals(txtEmail.Text.ToString()) &&
                           data.Password.Equals(txtPassword.Text.ToString())
                       select data).FirstOrDefault(); 

请在using块中包含您的上下文,以便在使用后处理您的上下文。

using(var dc = new SiteDataContext()) {
    Session["UserData"] = (from data in dc.Users
                           where data.Email.Equals(txtEmail.Text.ToString()) &&
                               data.Password.Equals(txtPassword.Text.ToString())
                           select data).FirstOrDefault(); 
}