Помощь с отладкой SQL / LINQ - PullRequest
0 голосов
/ 10 ноября 2009

У меня проблема со следующим утверждением, которое возвращает ошибку «Последовательность не содержит элементов»:

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 ]

3 голосов
/ 10 ноября 2009

.Single() всегда терпит неудачу, если коллекция, к которой она вызывается, пуста или содержит более одного элемента. SQL Server не возвращает никаких строк, что должно быть здесь.

Вы можете использовать .FirstOrDefault() или .SingleOrDefault() и сравнить возвращаемое значение со значением null, в зависимости от того, ожидаете ли вы, что по вашему запросу будет возвращен один элемент.

например. у вас есть уникальное ограничение на строку «UserName», по которой вы фильтруете, вы должны использовать .SingleOrDefault(). Если возвращается ноль, строка не найдена. Несколько строк никогда не будут возвращены.

1 голос
/ 10 ноября 2009

Получаемое InvalidOperationException выдается только тогда, когда запрос дал результатов нет .

Единственное, что приходит мне в голову (, поскольку вы говорите, что уверены, что строка существует в базе данных ), это то, что вы, возможно, подключаетесь к другой базе данных .

Проверьте строку подключения вашего DataContext и убедитесь, что вы запрашиваете ту же базу данных, что и в Management Studio.

Редактировать: Кстати, вы запрашиваете таблицу SqlMembershipProvider aspnet_Users, чтобы найти пользователей по UserName, вы можете захотеть взглянуть на Membership.FindUsersByName метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...