Am întrebat această întrebare . Ceea ce ma condus la o noua intrebare :)
Până în acest moment, am folosit următorul model de selectare a obiectelor cu Linq în SQL, în scopul de a putea gestiona 0 "rânduri" returnate de interogare:
var person = (from p in [DataContextObject].Persons
where p.PersonsID == 1
select new p).FirstOrDefault();
if (person == null)
{
//handle 0 "rows" returned.
}
Dar nu pot folosi FirstOrDefault ()
atunci când fac:
var person = from p in [DataContextObject].Persons
where p.PersonsID == 1
select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode };
// Under the hood, this pattern generates a query which selects specific
// columns which will be faster than selecting all columns as the above
// snippet of code does. This results in a performance-boost on large tables.
How do I check for 0 "rows" returned by the query, using the second pattern?
UPDATE:
Cred că construirea mea nu reușește deoarece am încercat să alocăm rezultatul interogării unei variabile declarate [DataContext] .User
.
this._user = (from u in [DataContextObject].Users
where u.UsersID == [Int32]
select new { u.UsersID }).FirstOrDefault();
Eroare de compilare: nu se poate converti implicit tipul "AnonymousType # 1" la "[DataContext] .User".
Orice gânduri despre cum pot să înțeleg asta? Ar trebui să-mi fac obiectul propriu?
De ce poți continua să faci ceva? Vă dă o eroare?
var person = (from p in [DataContextObject].Persons
where p.PersonsID == 1
select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode }).FirstOrDefault();
if (person == null) {
//handle 0 "rows" returned.
}
Acesta este încă un obiect de referință ca și obiectul dvs. real, este doar anonim, astfel încât să nu cunoașteți tipul real înainte de compilarea codului.
Actualizare:
Văd acum ceea ce ați întrebat de fapt ! Ne pare rău, răspunsul meu nu mai este valabil. Credeam că nu vei obține o valoare nulă atunci când va fi gol. Răspunsul acceptat este corect, dacă doriți să utilizați obiectul în afara domeniului de aplicare, trebuie să creați un tip nou și să utilizați doar MyType (...). Știu că RefactorPro de la DevEx are un refactorizant pentru asta, și cred că și resharper-ul are același efect.
Apel .FirstOrDefault (null), astfel:
string[] names = { "jim", "jane", "joe", "john", "jeremy", "jebus" };
var person = (
from p in names where p.StartsWith("notpresent") select
new { Name=p, FirstLetter=p.Substring(0,1) }
)
.DefaultIfEmpty(null)
.FirstOrDefault();
MessageBox.Show(person==null?"person was null":person.Name + "/" + person.FirstLetter);
Asta face truc pentru mine.
if (person.Any()) /* ... */;
SAU
if (person.Count() == 0) /* ... */;