Sequence包含多个元素 - 虽然它应包含多个元素

时间:2016-07-25 08:16:50

标签: c# linq

我知道“序列包含多个元素”的主题已在此处介绍过,但我找不到任何适合我案例的内容。
这是代码:

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

完整的错误消息:

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

提到的异常是在第一行引发的。问题是它是一个列表,因此它应该包含多个元素。

感谢您对此的意见。
分辨率:
错误在第95行,因为查询的结果有多个记录。将其重写为:

app.all('/*', function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
});

解决了这个问题。仍然不知道是错误被抛到另一条线上的原因。

2 个答案:

答案 0 :(得分:3)

不是第一行,而是第二行:

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() ?? "";

答案 1 :(得分:1)

SingleOrDefault的文档告诉我们:

  

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

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

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