Linq to SQL: .FirstOrDefault () nu se aplică pentru a selecta noi {...}

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?

4

5 răspunsuri

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.

13
adăugat
A fost actualizată întrebarea mea.
adăugat autor roosteronacid, sursa
Acceptat, cele de mai sus ar trebui să funcționeze, cu excepția cazului în care există o eroare de execuție independentă.
adăugat autor Codewerks, sursa

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.

2
adăugat
if (person.Any()) /* ... */;

SAU

if (person.Count() == 0) /* ... */;
1
adăugat

În ceea ce privește UPDATE, trebuie să creați fie un tip propriu, fie să schimbați acest utilizator pentru a fi int sau să selectați întregul obiect, nu numai coloanele specifice.

1
adăugat

Puteți utiliza în continuare FirstOrDefault . Doar ai

var PersonFields = (...).FirstOrDefault()  

PersonalFields va fi nul sau un obiect cu acele proprietăți pe care le-ați creat.

0
adăugat