C# LINQ到SQL错误?序列包含多个元素

C# LINQ到SQL错误?序列包含多个元素,c#,sql-server,linq,C#,Sql Server,Linq,我正在使用以下查询: return ( from c in dataContext.Contacts where c.ContactID == contactID select c ).SingleOrDefault(); 在这种情况下,通过单步执行,“contactID”等于“6646”。“c.ContactID”是SQL Server 2008数据

我正在使用以下查询:

            return (
                from c in dataContext.Contacts
                where c.ContactID == contactID
                select c
            ).SingleOrDefault();
在这种情况下,通过单步执行,“contactID”等于“6646”。“c.ContactID”是SQL Server 2008数据库中“Contact”表上的主键字段。我在SSMS中运行了一个简单的select查询

select * from contact where contactid = 6646
我得到一个结果。但是LINQtoSQL查询抛出“序列包含多个元素”错误


我有双重和三重检查的连接字符串和主键列定义。我不清楚这是怎么发生的

这是单个方法引发的InvalidOperationException

这个方法应该只返回一个元素,而您的查询返回多个元素,您必须检查您在查询中使用的条件

如果找不到元素,它还会抛出异常。如果没有记录,可以使用SingleOrDefault()方法返回null(或默认值,即int为0)

如果需要多个元素,但只有一个元素是第一个元素,则可以使用first而不是Single或FirstOrDefault

试着调试并放置一个Where而不是Single,这样您就可以看到哪些行不应该在那里了

使用FirstOrDefault


SingleOrDefault是在您只需要一个项时使用的,我知道在这种情况下这不会是一个问题,但请尝试一下。

最终归结为使用LoadOptions加载相关对象,其中一个在LINQ to SQL中定义为1-1。但是,在关联的表中有两条关联的记录。因此,尽管查询所针对的主表只包含一个元素,但正如预期的那样,LINQ to SQL使用左连接加载相关对象,其中一个对象被复制,导致返回两条记录。

这看起来很奇怪,使用SQL Server Profiler检查查询,以查看服务器上实际执行的内容。稍后检查您的映射,并确保
ContactID
映射到实际的主键。是否可以显示方法的签名(声明方法的位置,包括返回类型和参数)?是否有名为Contact和Contacts(复数)的表?是否有可能使用LINQtoSQL和SQL查询不同的表?好的,这对Habib很有帮助。这是个奇怪的问题。我使用加载选项来加载相关对象,其中一个被定义为一对一,但是,数据库中存在两个(出于某种原因)。LINQ to SQL在预取1-1相关对象时也必须抛出此错误。首先,OP使用的是
SingleOrDefault
。第二,OP询问为什么在筛选表的主键时返回多个记录。我认为建议使用
Where
并检查结果是一个很好的建议。当然我会这样做,但正如我指定的,我在主键列上进行搜索,所以我知道在某个地方发生了其他事情。