我有(好)有一些代码可以让我获得我可爱的用户名并填充其内容的会话:
ManagePreferencesDataContext lg = new ManagePreferencesDataContext();
IEnumerable<tblManagePreference> ol;
ol = from login in lg.tblManagePreferences
where login.Username == Membership.GetUser().ToString()
select login;
if (ol.Count() > 0)
{
Session["Sess_MemberID"] = ol.First().MemberID;
Session["Sess_LocationID"] = ol.First().LocationID;
lblMemberID.Text = Session["Sess_MemberID"].ToString();
lblLocationID.Text = Session["Sess_LocationID"].ToString();
}
else
{
优秀!这工作得很好,花花公子。然而,我已经被指示转移到阳光明媚的实体框架,我会说实话,我们没有继续,即我对此知之甚少 - 我知道很少开始!
无论如何,我试图用以下内容修改上述代码:
VDSORDAL.PDC_VDSOREntities lg = new VDSORDAL.PDC_VDSOREntities();
IEnumerable<VDSORDAL.tblUserPreference> ol;
ol = from login in lg.tblUserPreferences
where login.Username == Membership.GetUser().UserName
select login;
if (ol.Count() > 0)
{
Session["VDS_MemberID"] = ol.First().MemberID;
Session["VDS_LocationID"] = ol.First().LocationID;
Session["VDS_Username"] = ol.First().Username;
lblMemberID.Text = Session["VDS_MemberID"].ToString();
lblLocationID.Text = Session["VDS_LocationID"].ToString();
}
else
{
}
}
然而,当我尝试运行此操作时,我收到的错误构成了此问题的标题。
总而言之 - 我哪里出错。
总之,很多人很抱歉这个问题非常简单。
答案 0 :(得分:4)
你在那里99%。问题是您将方法(GetUsername)传递给它不理解的L2E解析器。在这种情况下,您希望处理值而不是方法调用:
VDSORDAL.PDC_VDSOREntities lg = new VDSORDAL.PDC_VDSOREntities();
IEnumerable<VDSORDAL.tblUserPreference> ol;
string userName = Membership.GetUser().UserName; //store the value
ol = from login in lg.tblUserPreferences
where login.Username == userName
select login;
if (ol.Count() > 0)
{
Session["VDS_MemberID"] = ol.First().MemberID;
Session["VDS_LocationID"] = ol.First().LocationID;
Session["VDS_Username"] = ol.First().Username;
lblMemberID.Text = Session["VDS_MemberID"].ToString();
lblLocationID.Text = Session["VDS_LocationID"].ToString();
}
else
{
}
}
这是因为LINQ to Entities Provider评估表达式以构建查询。它无法在Membership对象上执行该方法。
答案 1 :(得分:0)
Linq尝试从您提供的查询中构建一个SQL语句。因此,它需要一个Membership.GetUser().UserName
的SQL equilvanent,它不存在。
简单的灵魂就是将它从LINQ查询中删除:
var name = Membership.GetUser().UserName;
ol = from login in lg.tblUserPreferences
where login.Username == name
select login;
请注意,有一些.NET方法(例如Trim()
和Contains()
),它们具有LINQ知道的SQL副本,并且可以转换为SQL。