코젤브

[.NET core] SqlKata 사용 시 유의사항 - FirstOrDefaultAsync<> 본문

컴공의 일상/C#

[.NET core] SqlKata 사용 시 유의사항 - FirstOrDefaultAsync<>

코딩하는 젤리 2024. 7. 24. 11:59

SqlKata 를 가지고 열심히 실습을 하던 중..

GET 해올 때 모두 초기 값으로 읽어오는 오류를 발견했다.

 

분명 이전에도 만났던 오류 같은데 정리를 안해두어서 똑같이 삽질을 한시간..을 했다.

그래서 내가 보려고 적어둔다............

 

[결론] 

FirstOrDefaultAsync<> 이런 식으로 바로 읽어오지말고,

FirstOrDefaultAsync(); 이렇게 읽어와서 추후에 객체를 생성해 각각 매핑해주자

 

읽어오는데 None 으로 읽어오는게 아니라

그냥 초기값으로 읽어와서 정말.. 오류를 찾기 힘들었는데,

 

쿼리문을 직접 넣어서 비교해보니 FirstOrDefaultAsync<>로 바로 내가 설정한 Model class 형식으로 가져오려고 해서 생기는 문제라는 것을 알게 되었다.

public async Task<CharInfo> GetCharInfoDataAsync(string playerId) // 오류 있음
{
    var charInfo = await _queryFactory.Query("char_info")
        .Where("player_id", playerId)
        .FirstOrDefaultAsync<CharInfo>(); // 이 부분에서 매핑 시 오류?
    return charInfo;
}

 

FirstOrDefaultAsync<CharInfo> 이런 식으로 읽어올 때 CharInfo 형식으로 가져올 때 오류가 난 것 같다..

 

따라서 아래처럼 FirstOrDefaultAsync()로 읽어온다음, 객체를 생성해서 매핑해주는 것이 안전하다!

public async Task<CharInfo> GetCharInfoDataAsync(string playerId)
{
    try
    {
        var result = await _queryFactory.Query("char_info")
            .Where("player_id", playerId)
            .Select("player_id", "char_name", "char_exp", "char_level", "char_win", "char_lose", "char_draw")
            .FirstOrDefaultAsync();

        if (result == null)
        {
            _logger.LogWarning("No data found for playerId: {PlayerId}", playerId);
            return null;
        }

        var charInfo = new CharInfo
        {
            PlayerId = result.player_id,
            CharName = result.char_name,
            Exp = result.char_exp,
            Level = result.char_level,
            Win = result.char_win,
            Lose = result.char_lose,
            Draw = result.char_draw
        };

        _logger.LogInformation("GetCharInfoDataAsync succeeded for playerId: {PlayerId}", playerId);
        return charInfo;
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "An error occurred while getting char info data for playerId: {PlayerId}", playerId);
        throw;
    }
}

 

무서운 녀석, 앞으로도 <> 는 조심해서 사용하자.

 

 

지금 글 작성하다가 든 생각인데, 애초에 넣을 때 new로 생성해서 받으면 문제 없을 것 같긴 하네요..

(아래 같은 느낌으로)

public async Task<bool> UpdateCharacterNameAsync(string playerId, string newCharName)
{
    var affectedRows = await _queryFactory.Query("char_info")
        .Where("player_id", playerId)
        .UpdateAsync(new { char_name = newCharName });

    return affectedRows > 0;
}

 

 

 

* 틀린 부분이 있다면 댓글 부탁드립니다