0

指定されたユーザー名とパスワードがデータベースに存在するかどうかを確認する次のコードがあります。

    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));
        }
    }

データベースにユーザー名とパスワードがある場合、これは正常に機能しますが、ユーザー名またはパスワードが間違っていてレコードが見つからない場合はエラーがスローされます。

これは簡単かもしれませんが、私はラムダが初めてなので、正しく理解できませんでした。

null を処理できるようにラムダ クエリを変更するにはどうすればよいですか?

ありがとう

4

5 に答える 5

2

SingleOrDefaultを使用します。これは、1つのレコードのみを返すか、レコードが存在しない場合はnullを返します。

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

後で確認できます:

User returnedObject = GetUserByUserNameAndPassword(username,password)

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

基準に対して複数のレコードが存在する場合、Single/SingleOrDefaultは例外をスローすることに注意してください。

于 2012-09-25T10:19:14.457 に答える
2

Singleからに変更する必要がSingleOrDefaultあります。データが一致しない場合は null を返します

context.UserEntities.SingleOrDefault(u => u.UserName == userName && 
                                          u.UserPassword == userPassword)
于 2012-09-25T10:19:00.453 に答える
1

.Any()一致するレコードが見つかった場合は true を返し、レコードが見つからない場合は false を返します。

したがって、既存のコードを少し変更するだけで機能します。

      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
             }
            }
        }
于 2012-09-25T10:21:51.630 に答える
1

FirstOrDefault または SingleOrDefualt を利用し、以下のように null をチェックします

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

if(user!=null)
{
 //do code
} 
于 2012-09-25T10:21:58.733 に答える
1

Map を呼び出す前に、SingleOrDefaultを使用して確認しますNull

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; 
    } 
} 
于 2012-09-25T10:22:30.120 に答える