2016-03-21 4 views
1

Ich versuche, zuerst die DomainIDs von einem bestimmten zu suchen Tabelle basierend auf dem Mandanten und dann für die Domain-ID suche ich nach Domain-Namen in einer anderen Tabelle und füge eine Liste hinzu. Beim Hinzufügen des Domänenobjekts in meiner Liste wird ein Fehler angezeigt.Die beste überladene Methodenübereinstimmung für 'System.Collections.Generic.List <XXX.Models.Domain> .Add (XXX.Models.Domain)' hat einige ungültige Argumente

public IEnumerable<Domain> GetAllByTenant(Guid tenantId) 
    { 
     List<Domain> domains = null; 
     var ids = _applicationDbContext.TenantDomainMap.Where(x => x.TenantId == tenantId).Select(x => x.DomainId); 

     foreach (var id in ids) 
     { 
      var domain = _applicationDbContext.Domain.Where(x => x.DomainId == id); 
      domains.Add(domain); 

     } 
     return domains; 
    } 

erhalte ich folgende Fehler bei domains.Add (Domain): 1. Die beste überladene Methode Spiel für ‚System.Collections.Generic.List.Add (XXX.Models Mein Code ist wie unten dargestellt .Domain) 'hat einige ungültige Argumente 2. kann nicht von' System.Linq.IQueryable 'zu' XXX.Models.Domain 'konvertieren

Bitte helfen Sie mir bei der Lösung dieses Problems.

Antwort

2

Die Methode Where gibt immer eine IQueryable zurück, weil sie nicht wissen kann, wie viele Elemente mit Ihrem Prädikat übereinstimmen.

Es gibt vier mögliche Methoden, die Sie nach dem Aufruf Where hinzufügen können, um dieses Problem zu lösen.

Einzel: Diese Methode erwartet nur ein Spiel und es wird eine Ausnahme auslösen, wenn mehr als eine Übereinstimmung gefunden wurde oder wenn keine Übereinstimmungen gefunden wurden.

var domain = _applicationDbContext.Domain.Where(x => x.DomainId == id).Single(); 

SingleOrDefault: Dieses Verfahren ist das gleiche wie Single außer, dass sie die Ergebnisse der Standard (T) zurück, wo T Ihre Art ist, wenn keine Ergebnisse gefunden werden; Dies ist normalerweise null.

var domain = _applicationDbContext.Domain.Where(x => x.DomainId == id).SingleOrDefault(); 

Erste: Diese Methode wird das erste Element in der Liste zurück und wird nur eine Ausnahme auslösen, wenn keine Übereinstimmungen gefunden wurden.

FirstOrDefault: Diese Methode im Gegensatz zu First keine Ausnahme auf keine Streichhölzer werfen, anstatt es wie SingleOrDefault funktioniert und wird wieder den Standardwert des Typs.

var domain = _applicationDbContext.Domain.Where(x => x.DomainId == id).FirstOrDefault(); 

Vorausgesetzt, dass Sie auf einer Id eine Suche tun, Single ist wahrscheinlich die richtige Wahl, wenn auch je nach Sparlogik SingleOrDefault benötigt werden.

+0

Vielen Dank für die ausführliche Erklärung. Ich hab es jetzt. Schätze deine Hilfe. – Rash

+0

@Rash Vergessen Sie nicht, diese Antwort zu akzeptieren. –

+0

@Rash Froh, geholfen zu haben. – Phaeze

1

Versuchen Sie, eine .FirstOrDefault(); hinzuzufügen, um sicherzustellen, dass nur die erste Übereinstimmung zurückgegeben wird, die von Where zurückgegeben wurde.

foreach (var id in ids) 
{ 
     var domain = _applicationDbContext.Domain.Where(x => x.DomainId == id).FirstOrDefault(); 
     domains.Add(domain); 
} 

Where kehrt Typ IEnumerable und Sie brauchen einen einzigen Domain Typ Ihrer Liste für jeden hinzuzufügen.

+0

Vielen Dank !! Es hat funktioniert :) – Rash

Verwandte Themen