2009-11-10 3 views
0

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

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) [[email protected]] 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4918 

При запуске в студии управления SQL-сервером сценарий возвращает ожидаемую строку (которая находится в таблице)

Я определил p0 с этой строкой:

DECLARE @p0 NVarChar(20) = '[email protected]' 

Любые идеи, почему это не удается? Благодаря!

ответ

1

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

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

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

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

+0

Возможно, вы правы, я не обратил внимания на этот аспект. –

+0

Строка подключения была :) – stringo0

+0

@Johannes: Да, мне пришлось перечитать вопрос, чтобы понять это :) – CMS

3

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

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

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

Смежные вопросы