C# SqlException,因为子查询返回的值超过1
我有下面的LINQ查询,我正在使用它来构造一个结构,以填充到JavaScript网格库中,这与本例无关,但我想我还是要解释一下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 =>
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的位置。