首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >序列包含多个元素-而它应该包含多个元素

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

Stack Overflow用户
提问于 2016-07-25 16:16:50
回答 2查看 4.1K关注 0票数 1

我知道“序列包含多个元素”的主题以前在这里讨论过,但我找不到任何适用于我的情况的东西。

代码如下:

代码语言:javascript
复制
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);

完整的错误消息:

代码语言:javascript
复制
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行出错,因为查询结果有多条记录。将其重写为:

代码语言:javascript
复制
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));

解决了问题。仍然不知道为什么错误被抛到了另一条线上。

EN

回答 2

Stack Overflow用户

发布于 2016-07-25 16:34:46

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

代码语言:javascript
复制
string mailCc = db.DRAFT_DLs
   .Where(dd => dd.MX_DL == "ALL")
   .Select(dd => dd.EMAIL)
   .SingleOrDefault() ?? "";

如果您使用Enumerable.SingleOrDefault(https://msdn.microsoft.com/en-us/library/system.linq.enumerable.singleordefault(v=vs.100%29.aspx)(or Single),您会说0个或1个记录是可以的,但多个记录是例外。这就是你得到异常的原因。对于Single,零也是例外。也许你想使用FirstOrDefault

代码语言:javascript
复制
string mailCc = db.DRAFT_DLs
   .Where(dd => dd.MX_DL == "ALL")
   .Select(dd => dd.EMAIL)
   .FirstOrDefault() ?? "";
票数 3
EN

Stack Overflow用户

发布于 2016-07-25 16:37:06

SingleOrDefault的文档告诉我们:

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

在您的例子中,这意味着在db.DRAFT_DLs中,dd.MX_DL等于"ALL"的记录不止一条。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38562716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档