2016-07-25 6 views
1

Ich weiß, das Thema "Sequenz enthält mehr als ein Element" wurde hier bereits behandelt, aber ich konnte nichts finden, was für meinen Fall gelten würde.
Hier ist der Code:Sequenz enthält mehr als ein Element - obwohl es mehr als eins enthalten sollte

var mailTo = db.DRAFT_DLs 
    .Where(dd => dd.MX_DL == argMailTo) 
    .Select(dd => new MailAddress(dd.EMAIL)) 
    .ToList(); 

string mailCc = db.DRAFT_DLs 
    .Where(dd => dd.MX_DL == "ALL") 
    .Select(dd => dd.EMAIL) 
    .SingleOrDefault() ?? ""; 

// ... 

mailTo.ForEach(rcpt => mail.To.Add(rcpt)); 
mail.CC.Add(mailCc); 

komplette Fehlermeldung:

Message :System.InvalidOperationException: Sequence contains more than one element 
    at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) 
    at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) 
    at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 
    at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression) 
    at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source) 
    at IncidentEmailEngine.Program.Main(String[] args) in c:\Dane\VS\IncidentEmailEngine\IncidentEmailEngine\Program.cs:line 94<br/> 
StackTrace : at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) 
    at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) 
    at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 
    at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression) 
    at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source) 
    at IncidentEmailEngine.Program.Main(String[] args) in c:\Dane\VS\IncidentEmailEngine\IncidentEmailEngine\Program.cs:line 94 

Und erwähnte Ausnahme in der ersten Zeile ausgelöst. Das Problem ist, dass es eine Liste ist und daher sollte es mehr als ein Element enthalten.

Vielen Dank für Ihre Eingabe.
Auflösung:
Fehler in Zeile 95, als das Ergebnis der Abfrage mehr als einen Datensatz hatte. Umschreiben in:

var mailTo = db.DRAFT_DLs 
    .Where(dd => dd.MX_DL == argMailTo) 
    .Select(dd => new MailAddress(dd.EMAIL)) 
    .ToList(); 

var mailCc = db.DRAFT_DLs 
    .Where(dd => dd.MX_DL == "ALL") 
    .Select(dd => new MailAddress(dd.EMAIL)) 
    .ToList(); 

// ... 

mailTo.ForEach(rcpt => mail.To.Add(rcpt)); 
mailCc.ForEach(rcpt => mail.CC.Add(rcpt)); 

löste das Problem. Immer noch nicht bekannt ist der Grund, warum Fehler auf eine andere harte Linie geworfen wurden.

string mailCc = db.DRAFT_DLs 
    .Where(dd => dd.MX_DL == "ALL") 
    .Select(dd => dd.EMAIL) 
    .SingleOrDefault() ?? ""; 

Wenn Sie Enumerable.SingleOrDefault (oder Single) Sie sagen verwenden, die keine oder eine Aufzeichnungen sind in Ordnung, aber mehr als eine ist außergewöhnlich:

+0

Die Ausnahme bitte anzeigen – Serghei

+4

Diese Ausnahme tritt normalerweise bei einem Aufruf von 'Single' auf, wenn die Sequenz mehr als ein Element enthält. Es ist schwer zu sehen, wie es aus dem Code in Ihrer Frage entstehen könnte. Stellen Sie eine [mcve] bereit. –

+0

Brechen Sie die linq-Anweisung in eine Reihe von verschiedenen Anweisungen auf, rufen Sie nach jeder Anweisung .ToList() auf und geben Sie dann an, auf welche die Ausnahme angewendet wird. –

Antwort

3

Es ist nicht auf den ersten, sondern auf der zweiten Linie geworfen. Deshalb bekommst du die Ausnahme. Mit Single ist Zero auch außergewöhnlich. Vielleicht möchten Sie FirstOrDefault verwenden:

string mailCc = db.DRAFT_DLs 
    .Where(dd => dd.MX_DL == "ALL") 
    .Select(dd => dd.EMAIL) 
    .FirstOrDefault() ?? ""; 
1

Die Dokumentation für SingleOrDefault sagt uns, dass:

InvalidOperationException (ausgelöst wird, wenn) Die Eingangssequenz mehr als ein Element enthält.

In Ihrem Fall bedeutet dies, dass in db.DRAFT_DLs Sie mehr als einen Datensatz, wo dd.MX_DL"ALL" entspricht.

Sie sollten dies überprüfen können, indem Sie die Tabelle DRAFT_DL in Ihrer Datenbank abfragen.

Verwandte Themen