Как я могу объединить эти запросы linq в один? - PullRequest
0 голосов
/ 23 января 2010

Будучи новичком в LINQ, я создал пару запросов и хотел бы объединить их в один, но я не уверен, как это сделать.Вот они:

var u = dc.Users.Where(w => w.UserName == userName).SingleOrDefault();

var m = dc.Memberships.Where(w => w.UserId == u.UserId).SingleOrDefault();

m.PasswordQuestion = securityQuestion;
m.PasswordAnswer = securityAnswer;

dc.SubmitChanges();

dc.Users это таблица aspnet_Usersdc.Membership это таблица aspnet_Membership

Кроме того, в чем разница между SingleOrDefault и FirstOrDefault?

Ответы [ 4 ]

5 голосов
/ 23 января 2010

Не уверен, что у них есть отношения (они должны). Если они это сделают, то конструктор linq-to-sql предоставит вам свойство User для объекта членства (или наоборот). Тогда вы можете написать что-то вроде этого:

var membership = dc.Memberships.Where(x => x.User.UserName == userName).SingleOrDefault();

Если у них нет отношений, вы можете написать что-то вроде этого:

var membership = (from m in dc.Membership join u in dc.Users on u.UserId equals m.UserId
                  where u.UserName == userName
                  select u).SingleOrDefault();

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

3 голосов
/ 23 января 2010

SingleOrDefault означает «если нет элементов, дайте мне значение по умолчанию, если он есть, дайте мне его, иначе выведите исключение» FirstOrDefault означает «если элементов нет, тогда укажите значение по умолчанию, в противном случае укажите первый».

Что касается вашего вопроса о комбинировании запросов - почему бы вам? Если код работает хорошо, как написано, зачем его менять?

Чтобы ответить на вопрос, который вы не задавали: обычный способ объединения запросов - это использование продолжения запроса . Общий шаблон:

var q1 = from y in something 
         somequeryclauses;
var q2 = from x in q1 
         someotherquerqyclauses;

Вы могли бы написать это как один большой запрос, подобный этому:

var q2 = from x in (from y in something 
                    somequeryclauses) 
         someotherqueryclauses;

который трудно читать. Вы можете объединить два запроса с продолжением запроса:

var q2 = from y in something 
         somequeryclauses 
         into x
         someotherqueryclauses;

Имеет смысл?

1 голос
/ 23 января 2010

У меня нет Visual Studio передо мной, но это будет что-то вроде этого:

var m = dc.Memberships.Where(w => w.Users.UserName == userName).SingleOrDefault(); 

m.PasswordQuestion = securityQuestion; 
m.PasswordAnswer = securityAnswer; 

dc.SubmitChanges(); 

w.Users позволяет переходить по ссылке внешнего ключа между таблицами членства и пользователей.

SingleOrDefault выдает исключение, если возвращается более одного результата. FirstOrDefault возвращает только первую запись.

1 голос
/ 23 января 2010

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

var m = dc.MemberShips where(w => w.UserId.UserName == userName).FirstOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...