2011-08-24 49 views
2

我的问题是我想要获取Linq结果的实体值。下面是我的方法无法使用Lambda表达式检索值

我的数据层方法:

private static readonly Func<DataContext, String, String, IQueryable<AuthenticateUserResult> > AuthenticateUser__impl= CompiledQuery.Compile((DataContext context, String username, String password) => 
( from u in context.GetTable<Yantriki.MeriRanchi.Web.UI.Core.User>() 
    where ((u.UserName == username) 
     && (u.Password == password) 
     && (u.IsActive == true)) 
    select new AuthenticateUserResult 
    { 
     MemberId = u.MemberId, 
     Email = u.Email, 
     Name = u.Name, 
     Role = u.Role, 
     UserName = u.UserName 
    })); 

上面的代码是由Visual LINQ的设计器生成的。现在,我使用下面的方法将结果返回给用户界面层:

public static IQueryable AuthenticateUser(User user) 
     { 
      var db = new MeriRanchiDataContext(); 
      return MeriRanchiQueries.AuthenticateUser(db, user.UserName, user.Password); 
     } 

在我的UI层,我需要存储在实体值,成员Id,电子邮件,名称,这样我可以将其设置为会话。那么,这将是什么表达。

回答

3

返回通用IQueryable<AuthenticateUserResult>而不是非通用IQueryable

+1

代码我这样做,但我得到空引用异常而获取的实体。 –

+0

空引用异常与返回类型无关。 –

+0

不与返回类型...它出现在我应用lambda表达式来获取结果时。 –

0

嗨我正在回答我自己的问题,因为我得到了它的解决方案,并认为它可能有助于其他人面临同样的问题。

我做了什么?

  1. 我回复返回类型IQueryable<AuthenticateUserResult>
  2. 新增的SingleOrDefault()的扩展。
  3. 使用下面

var userResults = 
    MeriRanchiDataManager.AuthenticateUser(user).SingleOrDefault(); 

Session["UserName"] =userResults.MemberId; 
Session["Email"] = userResults.Email; 
Session["Role"] = userResults.Role.ToString(); 
Session["MemberId"] = userResults.MemberId.ToString(); 
Session["Name"] = userResults.Name;