03Usr
03Usr

Reputation: 3435

Check Nulls in Lambda

We have the following code to check if the given username and password exists in database:

    public User GetUserByUserNameAndPassword(string userName, string userPassword)
    {
        using (var context = DataObjectFactory.CreateContext())
        {
            return Mapper.Map(context.UserEntities.Single(u => u.UserName == userName && u.UserPassword == userPassword));
        }
    }

If we have the username and password in database this works fine but throws an error if username or password is wrong and no records found.

This might be simple but as I am new to lambda could not get get it right.

How can I change the lambda query so we can handle nulls?

Thanks

Upvotes: 0

Views: 202

Answers (5)

Habib
Habib

Reputation: 223187

Use SingleOrDefault, which will return only one record or null if none exists.

return Mapper.Map(context.UserEntities.SingleOrDefault(u => u.UserName == userName && u.UserPassword == userPassword));

Later you can check:

User returnedObject = GetUserByUserNameAndPassword(username,password)

if(returnedObject == null)
{
//User doesn't exist
}

Remember Single/SingleOrDefault will throw an exception if multiple records exist against the criteria.

Upvotes: 2

Richard Friend
Richard Friend

Reputation: 16018

Use SingleOrDefault and check for Null prior to calling Map

public User GetUserByUserNameAndPassword(string userName, string userPassword) 
{ 
    using (var context = DataObjectFactory.CreateContext()) 
    { 
        var user = context.UserEntities.SingleOrDefault(u => u.UserName == userName && u.UserPassword == userPassword);
        return user !=null ? Mapper.Map(user) : null; 
    } 
} 

Upvotes: 1

Pranay Rana
Pranay Rana

Reputation: 176886

Make use of FirstOrDefault or SingleOrDefualt and check for null like as below

var user =context.UserEntities.SingleOrDefault(u => u.UserName == userName 
                                           && 
                                           u.UserPassword == userPassword);

if(user!=null)
{
 //do code
} 

Upvotes: 1

Simon West
Simon West

Reputation: 3788

.Any() will return true if a matching record is found or false if no record is found.

So a slight modifcation to you existing code will work.

      public User GetUserByUserNameAndPassword(string userName, string userPassword)
        {
            using (var context = DataObjectFactory.CreateContext())
            {
             if (context.UserEntities.Any(u => u.UserName == userName && u.UserPassword == userPassword))
             {
                return Mapper.Map(context.UserEntities.Single(u => u.UserName == userName && u.UserPassword == userPassword));
             }
             else
             {
              //Deal with no user here through chosen method
             }
            }
        }

Upvotes: 1

cuongle
cuongle

Reputation: 75306

You should change from Single to SingleOrDefault, it returns null when no data match

context.UserEntities.SingleOrDefault(u => u.UserName == userName && 
                                          u.UserPassword == userPassword)

Upvotes: 2

Related Questions