LINQ to Entities не распознает метод «Метод System.Web.Security.MembershipUser GetUser ()» - PullRequest
2 голосов
/ 12 июля 2010

У меня есть (неплохо было) немного кода, который бы дал мне мое прекрасное имя пользователя и заполнил сеанс его содержимым:

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
            {

Fantastic! Это работало хорошо и денди. Тем не менее, я получил указание перейти на солнечную Entity Framework и, честно говоря, мы не понимаем, т. Е. Я не знаю достаточно об этом - я знаю очень мало, чтобы начать с!

В любом случае, я попытался изменить вышеуказанный код следующим образом:

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 ]

4 голосов
/ 12 июля 2010

Ты на 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 оценивает выражение для построения запроса. Он не может выполнить метод для объекта Membership.

0 голосов
/ 12 июля 2010

Linq - попытка построить оператор SQL из запроса, который вы ему дали.Таким образом, он хочет, чтобы SQL-эквивалент Membership.GetUser().UserName не существовал.

Простая задача - извлечь его из запроса LINQ:

var name = Membership.GetUser().UserName;

ol = from login in lg.tblUserPreferences 
                 where login.Username == name 
                 select login; 

Обратите внимание, что есть некоторыеМетоды .NET (такие как Trim() и Contains()), которые имеют аналоги SQL, о которых знает LINQ, и могут переводиться в SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...