2010-07-12 3 views
2

J'ai (bien eu) un peu de code qui me procurerait mon joli nom d'utilisateur et remplirait une session avec son contenu:LINQ to Entities ne reconnaît pas la méthode 'System.Web.Security.MembershipUser GetUser() Méthode'

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 
      { 

Fantastique! Cela a fonctionné bien et dandy. Cependant, on m'a demandé de passer à Entity Framework ensoleillé et je vais être honnête, nous ne comprenons pas, je n'en sais pas assez - je sais très peu de choses pour commencer!

Quoi qu'il en soit, j'ai tenté de modifier le code ci-dessus avec les éléments suivants:

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

Cependant, lorsque je tente d'exécuter ce que je reçois l'erreur qui forme le titre de cette question ici. Donc, en résumé - où vais-je me tromper?

Comme toujours, de nombreuses excuses pour ce qui est très probablement une question très simple.

Répondre

4

Vous êtes 99% là-bas. Le problème est que vous passez une méthode (GetUsername) dans l'analyseur L2E qu'elle ne comprend pas. Vous voulez traiter avec des valeurs plutôt que les appels de méthode dans ce cas:

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

Cela se produit parce que le fournisseur LINQ to Entities évalue l'expression pour construire la requête. Il ne peut pas exécuter la méthode sur l'objet Membership.

+0

Je t'aime Dave Swersky !!! Merci beaucoup. J'apprendrai cette chose en développement sanglante si elle me tue .. ou je me tue! –

+0

Je suis heureux d'avoir pu aider :) –

0

Linq essaie de générer une instruction SQL à partir de la requête que vous lui avez fournie. Donc, il veut un equilvanent SQL de Membership.GetUser().UserName qui n'existe pas.

Le soultion simple est de le retirer de la requête LINQ:

var name = Membership.GetUser().UserName; 

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

Notez qu'il existe des méthodes .NET (tels que Trim() et Contains()), qui ont leurs équivalents SQL qui LINQ a connaissance, et peut être traduit en SQL.

Questions connexes