帮助SQL / LINQ调试

时间:2009-11-10 06:10:14

标签: sql linq linq-to-sql

我遇到以下语句时遇到问题,该语句返回错误“Sequence contains no elements”:

var vUser = (from u in this.dcLAUNCHOnline.aspnet_Users
                             where u.UserName.Equals(this.wCreateUser.UserName)
                             select u).Single();

正在生成的SQL:

SELECT [t0].[ApplicationId],
 [t0].[UserId],
 [t0].[UserName],
 [t0].[LoweredUserName],
 [t0].[MobileAlias],
 [t0].[IsAnonymous],
 [t0].[LastActivityDate],
 [t0].[FirstName],
 [t0].[LastName],
 [t0].[Address_Street],
 [t0].[Address_City],
 [t0].[Address_Province],
 [t0].[Address_Country],
 [t0].[Address_PostalCode],
 [t0].[Telephone_Main_AreaCode],
 [t0].[Telephone_Main_Prefix],
 [t0].[Telephone_Main_LineNumber],
 [t0].[Telephone_Main_Extension],
 [t0].[Telephone_Mobile_AreaCode],
 [t0].[Telephone_Mobile_Prefix],
 [t0].[Telephone_Mobile_LineNumber],
 [t0].[Telephone_Mobile_Extension],
 [t0].[Telephone_Other_AreaCode],
 [t0].[Telephone_Other_Prefix],
 [t0].[Telephone_Other_LineNumber],
 [t0].[Telephone_Other_Extension],
 [t0].[Gender],
 [t0].[BirthDate]
FROM [dbo].[aspnet_Users] AS [t0]
WHERE [t0].[UserName] = @p0
-- @p0: Input NVarChar (Size = 20; Prec = 0; Scale = 0) [six.string@gmail.com]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4918

在SQL Server管理工作室中运行时,脚本会返回我期望的行(在表中)

我用这一行定义了p0:

DECLARE @p0 NVarChar(20) = 'six.string@gmail.com'

为什么会失败的任何想法?谢谢!

2 个答案:

答案 0 :(得分:3)

如果调用它的集合为空或包含多个元素,

.Single()总是会失败。 SQL Server不返回任何行,这必须是这里的情况。

您可以使用.FirstOrDefault().SingleOrDefault()并根据您是否希望查询返回单个元素来检查返回值。

E.g。您对要过滤的“UserName”行有唯一约束,您应该使用.SingleOrDefault()。如果返回null,则未找到任何行。永远不会返回多行。

答案 1 :(得分:1)

只有当查询产生无结果时,才会抛出您获得的InvalidOperationException

我唯一想到的是,(因为你说你确定数据库中存在该行),你可能正在连接其他数据库

检查DataContext的连接字符串,确保查询与Management Studio中相同的数据库。

编辑:顺便说一句,您正在直接查询SqlMembershipProvider aspnet_Users表,要按UserName查找用户,您可能需要查看Membership.FindUsersByName方法。