C# LINQ to实体无法识别方法“System.Web.Security.MembershipUser GetUser()方法”

C# LINQ to实体无法识别方法“System.Web.Security.MembershipUser GetUser()方法”,c#,linq-to-entities,C#,Linq To Entities,我已经有了一些代码,可以获得我可爱的用户名,并用其内容填充会话: ManagePreferencesDataContext lg = new ManagePreferencesDataContext(); IEnumerable<tblManagePreference> ol; ol = from login in lg.tblManagePreferences where login.Usernam

我已经有了一些代码,可以获得我可爱的用户名,并用其内容填充会话:

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
            {
太棒了!那很好,很漂亮。然而,我已经被指示转到sunny实体框架,老实说,我们还没有开始,也就是说,我对它了解得不够-我一开始知道的很少

无论如何,我试图用以下内容修改上述代码:

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
            {
            }
          }
然而,当我尝试运行此程序时,我收到了一个错误,它构成了此问题的标题

总之,我错在哪里


像往常一样,对于一个很可能非常简单的问题,很多人表示歉意。

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

发生这种情况是因为LINQtoEntities提供程序对表达式求值以生成查询。它无法在成员身份对象上执行该方法。

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。

我爱你Dave Swersky!!!非常感谢你。如果这该死的东西杀了我,我会学的……或者我杀了自己!