smalczyk1
smalczyk1
#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());
  • Najlepsze
  • Wszystkie komentarze
budyn
budyn
1
SklepLogin może być nullem
Endriu_
@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.
budyn
budyn
0
@Endriu_:

NULL przechodzi bo

x.SklepLogin!=null || x.SklepLogin !=""
smalczyk1
smalczyk1
smalczyk1 Autor
0
@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",
Endriu_
@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
Endriu_
@smalczyk1: Inna sprawa, że wszystko to w Where można napisać krócej:

x => x.SklepLogin.Equals(email, StringComparison.OrdinalIgnoreCase);
smalczyk1
smalczyk1
smalczyk1 Autor
0
@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();
Endriu_
@smalczyk1:
.Where(x => x.SklepLogin.Equals(email, StringComparison.OrdinalIgnoreCase)) ?
smalczyk1
smalczyk1
smalczyk1 Autor
0
@Endriu_: Też nie p------e jakieś

var kontrahent = _db.Database.SqlQuery(SqlQueries.UsersLoginByEmail(email, lang))
.Where(n => n.SklepLogin.Equals(email, StringComparison.OrdinalIgnoreCase))
.FirstOrDefault();
Endriu_
@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"?
smalczyk1
smalczyk1
smalczyk1 Autor
0
Wynik zpaytania

public class KontrahentLogin
{
public int Id { get; set; }
public string SklepLogin { get; set; }
smalczyk1
smalczyk1
smalczyk1 Autor
0
pieczarrek
pieczarrek
@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() ==
smalczyk1
smalczyk1
smalczyk1 Autor
0
@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))
pieczarrek
pieczarrek
@smalczyk1: co jest w SqlQueries.UsersLoginByEmail? zaloguj sobie kazda zmienna

a tworzysz ty napewno db ?

napisz cos takiego
if(
smalczyk1
smalczyk1
smalczyk1 Autor
0
@pieczarrek Userbyemail to query co wyżej wstawiłem.Zaraz sprawdzę resztę