2016-07-25 20 views
1

「シーケンスには複数の要素が含まれています」というトピックがありますが、ここでは説明しましたが、シーケンスには複数の要素が含まれていますが、複数の要素が含まれている必要があります

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); 

完全なエラーメッセージ:
は、ここでは、コードです

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 

そして、例外が最初の行にスローされます言及しました。問題はそれがリストなので、複数の要素を含む必要があります。

あなたのご意見ありがとうございます。
解決方法:
クエリの結果が複数のレコードを持つため、エラーが95行目にありました。それを書き直す:

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)); 

問題を解決しました。まだ知られていないのは、エラーが別の行にスローされた理由です。

+0

例外を表示してください – Serghei

+4

この例外は通常、シーケンスに複数の項目が含まれている「シングル」の呼び出しで発生します。それはあなたの質問のコードからどのように発生する可能性を確認するのは難しいです。 [mcve]を提供してください。 –

+0

linq文をそれぞれの文の後に.ToList()を呼び出して、一連の別々の文に分割し、例外が投げられるものを教えてください。 –

答えて

3

それは、最初ではなく、二行目に投げられていない:

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

あなたがEnumerable.SingleOrDefault(またはSingle)を使用する場合は、ゼロまたは1つのレコードがOKですが、複数の例外であると言います。そういうわけで、あなたは例外を受け取ります。 Singleがゼロの場合も例外ではありません。たぶん、あなたはFirstOrDefaultを使用したい:

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

SingleOrDefaultのドキュメントがあることを教えてくれる:

InvalidOperationExceptionがは、(ときにスローされる)入力シーケンスは、複数の要素が含まれています。あなたのケースでは

が、これはdb.DRAFT_DLsにあなたはdd.MX_DL"ALL"に等しい複数のレコードを有することを意味します。

データベースのDRAFT_DLテーブルを照会することでこれを確認できます。

関連する問題