Vra

Ek kry 'n tydsfout by die samestelling van die onderstaande kode en ek kan nie sien hoekom nie:

Verhoudings is baie tot baie verhoudings

 var contacts = groups_to_querry
                .SelectMany(x => x.Contacts)
                .Where(x => x.ID == Guid.Empty)
                .SelectMany(p => p.ContactDetails)
                .Where(x => x.ID == Guid.Empty)
                .SelectMany(x => x.Contacts);  //This line gives me a compile time error 
                //Error : The Type argumetns for method 'System.Linq.Enumerable.SelectMany<TSource,Tresult>
                //(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,
                //System.Collections.Generic.IEnumerable<TResult>>)' cannot be infrred from the usage.  
                //Try specifying the type arguments explicitly
Was dit nuttig?

Oplossing

Die tweede keer waarvoor u skakel .SelectMany(x => x.Contacts), werk u tans met 'n versameling van ContactDetails. Dit is te betwyfel dat u dit sou kon gebruik SelectMany daarop. U sal moet gebruik Select in plaas daarvan.

SelectMany word gebruik as u verskeie versamelings van items wil kies en dit in een wil plaas IEnumerable. Select word op individuele velde gebruik. Aangesien u met tipe voorwerpe werk ContactDetail (wat ek aanneem, kan net een kontak hê), sal u gebruik moet gebruik Select

EDIT: Hier is wat u in 'n neutedop doen, stap vir stap:

groups_to_querry.SelectMany(x => x.Contacts): Uit al die groepe wat ek wil navraag doen, kies al hul vele kontakte. Elke groep het baie kontakte, so plaas hulle almal in 'n enkele IEnumerable Versameling van tipe Contact

.Where(x => x.ID == Guid.Empty): ... maar net die kontakte met 'n leë ID

.SelectMany(p => p.ContactDetails): Kies dan al die kontakte se vele kontakdetails. Elke kontak het baie kontakdetails, so plaas almal in 'n enkele IEnumerable Versameling van tipe ContactDetail

.Where(x => x.ID == Guid.Empty): ... maar net die kontakdetails met 'n leë ID

.SelectMany(x => x.Contacts);: Kies nou elk van die ContactDetails se vele kontakte. Aangesien die samesteller egter weet dat daar 'n een-tot-baie-verhouding tussen kontakte en kontakdetails is (en nie andersom nie), is die stelling nie moontlik nie, en toon dit dus 'n samestellingfout

Ander wenke

Ek interpreteer u beoogde navraag as "uit verskeie groepe kontakte, kies alle kontakte met ID = guid.empty en het ook besonderhede wat almal ID = guid.empty het".

Die manier waarop u kode eintlik geïnterpreteer word, is "uit alle kontakte wat Guid.emption het, kies alle besonderhede wat Guid.emption het, en kies uit hierdie besonderhede alle kontakte". Die eerste probleem is dat u uiteindelik die besonderhede kies. Dit beteken die finale SelectMany moet 'n Select, omdat x.Contacts Hier verwys na die baie-tot-een-verhouding van besonderhede tot kontakte.

Die tweede probleem is dat die resultaat duplikate van kontakte sal bevat, omdat dieselfde kontak vir elke besonderhede ingesluit is. Wat u in plaas daarvan moet doen, is om die kontakte direk te filter op grond van hul besonderhede -versamelings, soos hierdie:

groups_to_query
.SelectMany(g => g.Contacts)
.Where(c => c.ID == Guid.Empty)
.Where(c => c.ContactDetails.All(d => d.ID == Guid.Empty))

Opmerking Dit sal ook kontakte kies wat geen besonderhede het nie, wat verskillende gedrag is as u navraag, so ek is nie seker of dit is wat u wil hê nie. U kan nog 'n filter byvoeg vir ContactDetails.Any() Indien nie.

Redigeer: Aangesien u entiteitsraamwerk gebruik, sal bogenoemde waarskynlik nie werk nie. Miskien moet u die besonderhede in 'n subnavraag kies en dan in die geheue filter nadat dit uitgevoer word:

var queryResult =
    groups_to_query
    .SelectMany(g => g.Contacts)
    .Where(c => c.ID == Guid.Empty)
    .Select(c => new {
        contact = c,
        detailIDs = c.ContactDetails.Select(d => d.ID)
    }).ToList();

var contacts =
    queryResult
    .Where(r => r.detailIDs.All(id => id == Guid.Empty))
    .Select(r => r.contact);
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top