我看过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;
}
}
我无法从对象数据中获取数据。它给我以下错误
对象不包含'名称'的定义没有延伸 方法'名称'接受类型'对象'的第一个参数。可能 发现(您是否缺少指令或程序集引用?)
我想在另一个网页上显示登录用户的数据。请帮忙。
答案 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();
}