代码之家  ›  专栏  ›  技术社区  ›  stringo0

SQL/LINQ调试帮助

  •  0
  • stringo0  · 技术社区  · 15 年前

    以下语句有问题,返回错误“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 Management Studio中运行时,脚本不会返回我期望的行(在表中)

    我用这行定义了p0:

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

    你知道为什么会失败吗?谢谢!

    2 回复  |  直到 15 年前
        1
  •  1
  •   Christian C. Salvadó    15 年前

    这个 InvalidOperationException 只有当查询生成时才会抛出 没有结果 .

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

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

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

        2
  •  3
  •   Johannes Rudolph    15 年前

    .Single() 如果对其调用的集合为空或包含多个元素,则始终失败。SQL Server不返回任何行,这里必须是这种情况。

    你也可以用 .FirstOrDefault() .SingleOrDefault() 并检查返回值是否为空,这取决于您是否希望查询返回单个元素。

    例如,您在筛选的“用户名”行上有一个唯一的约束,您应该使用 .singleOrDefault()。 . 如果返回空值,则找不到任何行。无法返回多行。