LINQ to Entities无法识别方法'System.Web.Security.MembershipUser GetUser()Method'

时间:2010-07-12 16:16:30

标签: c# linq-to-entities

我有(好)有一些代码可以让我获得我可爱的用户名并填充其内容的会话:

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
            {
            }
          }

然而,当我尝试运行此操作时,我收到的错误构成了此问题的标题。

总而言之 - 我哪里出错。

总之,很多人很抱歉这个问题非常简单。

2 个答案:

答案 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。