序列包含多个元素,而它应该包含多个

  • 本文关键字:包含多 元素 c# linq
  • 更新时间 :
  • 英文 :


我知道"Sequence contains than one element"这个主题以前在这里已经介绍过了,但我找不到任何适用于我的案例的内容
这是代码:

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:DaneVSIncidentEmailEngineIncidentEmailEngineProgram.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:DaneVSIncidentEmailEngineIncidentEmailEngineProgram.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));

解决了这个问题。目前还不清楚的是,为什么错误被抛到了另一条艰难的线上。

它不是在第一行抛出的,而是在第二行:

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

如果使用Enumerable.SingleOrDefault(或Single),则表示零条或一条记录是可以的,但多条记录是例外的。这就是为什么你会得到例外。对于Single,零也是例外。也许你想使用FirstOrDefault:

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

SingleOrDefault的文档告诉我们:

InvalidOperationException(在时抛出)输入序列包含多个元素。

在您的情况下,这意味着在db.DRAFT_DLs中,您有多个dd.MX_DL等于"ALL"的记录。

您应该能够通过查询数据库中的DRAFT_DL表来验证这一点。

相关内容

  • 没有找到相关文章

最新更新