Wpis z mikrobloga

#dotnet #csharp #linq

linq zwraca NullReferenceException gdy zapytanie nie znajdzie nic.Jak mam zrobić zapytanie linq,żeby nie wywalało błędu.

Tak zwraca nullaExpection

var kontrahent = _db.Database.SqlQuery(SqlQueries.UsersLoginByEmail(email, lang))
.Where(x=>(x.SklepLogin!=null || x.SklepLogin !="") && x.SklepLogin.ToLower() == email.ToLower())
.FirstOrDefault();

var kontrahent = _db.Database.SqlQuery(SqlQueries.UsersLoginByEmail(email, lang))
.Where(n => string.Equals(n.SklepLogin.ToLower(), email.ToLower()))
.DefaultIfEmpty().FirstOrDefault();

`

var kontrahent = _db.Database.SqlQuery(SqlQueries.UsersLoginByEmail(email, lang))
.FirstOrDefault(x.SklepLogin.ToLower() == email.ToLower());
  • 17
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@smalczyk1:
1. Zmieńże te polskie nazwy i nie podążaj więcej tą drogą...
2. Co konkretnie jest tutaj nullem, kiedy leci exception?

@budyn: W pierwszej wersji ma x.SklepLogin !=null, więc powinno to pominąć taki przypadek.
  • Odpowiedz
@Endriu_: @budyn: Zapytanie zwraca 6 kolumn. Szuka po @ i jak go nie ma w bazie to zwraca same nagłówki kolumn.Expection leci w momencie wykonywania zapytania Linq

"ExceptionMessage": "Object reference not set to an instance of an object.",
"ExceptionType": "System.NullReferenceException",
  • Odpowiedz
@budyn: Aaaa, fak, tam jest OR :D Prościej pewnie:

!string.IsNullOrEmpty(x.SklepLogin)
@smalczyk1: null ci przychodzi w "SklepLogin" na którymś z wierszy (a przechodzi ORa, bo SklepLogin !="") a potem pewnie wołasz na
  • Odpowiedz
@Endriu_: Kurła nie idzie :(

var kontrahent = _db.Database.SqlQuery(SqlQueries.UsersLoginByEmail(email, lang))
.Where(x=>!string.IsNullOrEmpty(x.SklepLogin) && x.SklepLogin.ToLower() == email.ToLower())
.FirstOrDefault();
  • Odpowiedz
@Endriu_: Też nie p------e jakieś

var kontrahent = _db.Database.SqlQuery(SqlQueries.UsersLoginByEmail(email, lang))
.Where(n => n.SklepLogin.Equals(email, StringComparison.OrdinalIgnoreCase))
.FirstOrDefault();
  • Odpowiedz
@smalczyk1: Dobra, to inaczej - query zwraca 6 wierszy, tak? Każdy ma jakiś "SklepLogin"? Na pewno to wszystko, co przychodzi z bazy, jest poprawnie mapowane na "KontrahentLogin"?
  • Odpowiedz
@smalczyk1: zacznij to rozbijac (tylko do debugowania) na pare roznych linijek zebys mogl patrzec dokladnie co sie dzieje w ktorej

var kontrahent = _db.Database.SqlQuery(SqlQueries.UsersLoginByEmail(email, lang))

var konrtahentWhere = kontrahent.Where(x=>(x.SklepLogin!=null || x.SklepLogin !="") && x.SklepLogin.ToLower() ==
  • Odpowiedz
@pieczarrek: Nie mam możliwości debugowania tylko log :(.

Wywala już na pierwszym i dalej nic nie zwraca. Jeżeli podam poprawny @ ,który jest w bazie wszystko idzie cacy.Jak usune jeden znak i nic nie znajdzie w bazie to wywala nullexpection
var kontrahent = _db.Database.SqlQuery(SqlQueries.UsersLoginByEmail(email, lang))
  • Odpowiedz
@smalczyk1: ale w tej metodzie co sie dzieje? stringa zlepia? rozbij jeszcze bardziej:
var kontrahent = db.Database.SqlQuery(SqlQueries.UsersLoginByEmail(email, lang))

na
var database =
db.Database;
var kontrahent = database.SqlQuery(SqlQueries.UsersLoginByEmail(email, lang))
  • Odpowiedz