C# SqlException,因为子查询返回的值超过1

C# SqlException,因为子查询返回的值超过1,c#,linq-to-sql,linq-to-objects,C#,Linq To Sql,Linq To Objects,我有下面的LINQ查询,我正在使用它来构造一个结构,以填充到JavaScript网格库中,这与本例无关,但我想我还是要解释一下 var output = myObjects.Select( p => new RowModel { ID = p.LeadUID, Cells = new CellCollection(fields, p.myDataDatas.Where(q =>

我有下面的LINQ查询,我正在使用它来构造一个结构,以填充到JavaScript网格库中,这与本例无关,但我想我还是要解释一下

var output = myObjects.Select(
    p => new RowModel
    {
         ID = p.LeadUID,
         Cells =
             new CellCollection(fields,
                p.myDataDatas.Where(q => q.myField.ParentUID == null).Select(
                    q => new CellModel
                             {
                                 Value = q.Value,
                                 Name = q.myField.Description,
                                 Display = q.myField.Description
                             }).ToList()
                ,
                new CellModel
                    {
                        Name = "Campaign",
                        Display = "Campaign",
                        Value = p.Campaign.Name
                    }
                ,
                new CellModel
                    {
                        Name = "CampaignEnabled",
                        Display = "CampaignEnabled",
                        Value = p.Campaign.IsActive.ToString()
                    },
                new CellModel
                    {
                        Name = "Date Received",
                        Display = "Date Received",
                        Value = p.DateAdded.ToString()
                    }
                ,
                new CellModel
                    {
                        Name = "Is Valid",
                        Display = "Is Valid",
                        Value = BooleanMap[p.IsValid]
                    }
                ,
                new CellModel
                    {
                        Name = "Invalid Reason",
                        Display = "Invalid Reason",
                        Value = p.InvalidReason

                    }
                ,
                new CellModel
                    {
                        Name = "Is Returned",
                        Display = "Is Returned",
                        Value = BooleanMap[p.IsReturned]
                    }
                ,
                new CellModel
                    {
                        Name = "Return Reason",
                        Display = "Return Reason",
                        Value =
                            context.MYReturns.SingleOrDefault(
                                l => l.LeadUID == p.MyUID).ReturnReason
                    }
                ,
                new CellModel
                    {
                        Name = "Workflow",
                        Display = "Workflow",
                        Value =
                            context.Stages.SingleOrDefault(
                                s => s.LifecycleStageUID == p.LifecycleStageUID).
                            Name
                    }
                ,
                new CellModel
                    {
                        Name = "WorkflowEnabled",
                        Display = "WorkflowEnabled",
                        Value =
                            context.Stages.SingleOrDefault(
                                s => s.LifecycleStageUID == p.LifecycleStageUID).
                            IsActive.ToString()
                    }
                ,
                new CellModel
                    {
                        Name = "Status",
                        Display = "Status",
                        Value = p.MyStatus.Name
                    }
                ,
                new CellModel
                    {
                        Name = "StatusDeleted",
                        Display = "StatusDeleted",
                        Value = (p.MyStatus.Deleted).ToString()
                    }
                ,
                new CellModel
                    {
                        Name = "LeadSource",
                        Display = "Lead Source",
                        Value = MySourcesMap[p.AccountSourceUID].Name
                    }
                ,
                new CellModel
                    {
                        Name = "LeadSourceEnabled",
                        Display = "LeadSourceEnabled",
                        Value = AccountSoucesEnabledMap[p.AccountSourceUID].ToString()
                    }
                        )
                     }
            );
            var rows = output.ToList();
            return rows;
我希望更改代码中大多数变量的名称不会影响全局

我面临的问题是,有时我会收到以下
SQLException
消息:

子查询返回了多个值。当子查询紧跟在
=,!=,之后时,这是不允许的=或子查询用作表达式时

我想知道的是,在我的查询中,我在哪里做了一些有时(大部分时间)会起作用的错误,然后很少返回这个错误消息。如何正确地防止这种情况发生?

使用该属性显示查询生成的sql。当只有一个结果有效时,很可能有一个子查询正在生成多个结果。例如,如果子查询中返回多个结果,则以下sql将失败:

Select * from orders where customer_id = 
  (select customer_id from customer where name ='bob')
如果子查询返回多个结果,那么主查询中where子句的相等性就没有意义


您可能需要更改存储中某些数据列的唯一性,以确保子查询中只返回一行。另一种方法是更改类,以便指定给的特定问题属性是一个集合,而不是单个值。

如果表达式返回多个项,则
SingleOrDefault
调用将引发异常。如果它只是您想要的前1个,那么您可以尝试使用
FirstOrDefault

捕获异常,并使用datacontext.Log报告尝试的sql查询。这将为您提供重现问题的数据,并且您可以选择查询appart来查找导致问题的部分,这将为您提供需要更改linq的位置。