2014-01-07 5 views
1

Я пытаюсь преобразовать этот SQL-запрос в Linq в течение некоторого времени без успеха. Я выяснил, что в соединении с linq нельзя использовать условие ИЛИ, поэтому я попробовал один и тот же SQL-запрос, но с подзапросами. Вопрос подзапроса не работает вообще, он отображает неверные данные.Условия множественного соединения ИЛИ. SQL to Linq

SQLQuery с JOIN:

SELECT DISTINCT Users.Fname FROM Friends 
JOIN Users On Users.UserID = UserID2 OR Users.UserID = UserID1 
WHERE UserID1 = 1 OR UserID2 = 1 
AND Users.UserID != 1 AND Friends.PendingFriendRequest = 0 

SQLQuery с подзапросами:

SELECT DISTINCT Users.Fname FROM Friends, Users 
WHERE Users.UserID = Friends.UserID1 OR Users.UserID = Friends.UserID2 
AND UserID1 = 1 OR UserID2 = 1 
AND Users.UserID != 1 And Friends.PendingFriendRequest = 0 
+2

Это не работает, даже если добавить скобки: 'WHERE (userid1 = 1 ИЛИ UserID2 = 1)'? –

ответ

2

В запросе, если первое условие где UserID1 = 1 матчи затем остальная часть запроса будет игнорироваться.

Попробуйте добавить скобки к вашему запросу:

SELECT DISTINCT Users.Fname FROM Friends 
JOIN Users On Users.UserID = UserID2 OR Users.UserID = UserID1 
WHERE (UserID1 = 1 OR UserID2 = 1) 
AND Users.UserID != 1 AND Friends.PendingFriendRequest = 0 
+0

Спасибо, получил подзапрос, который работает сейчас! –

+0

@ пользователь3025336 добро пожаловать. – Bhushan

1

да, вы правы - множественным условия соединения с OR не допускаются в LINQ присоединиться, так как только equijoins и группа присоединяется поддерживаются.

Для достижения вашего сценария одним из решений было бы использовать объединение в linq вместо этого.

например:

var q = (from u in 
      (from u1 in users 
      join f1 in friends on u1.userId equals f1.user1Id 
      where !f1.PendingFriendRequest 
      select new {u1.Fname, FriendsWithId = f1.UserId, UserId = u2.UserId}) 
      .Union(from u2 in users 
      join f2 in friends on u2.userId equals f2.user2Id 
      where !f2.PendingFriendRequest 
      select new {u2.Fname, FriendsWithId = f2.UserId, UserId = u2.UserId}) 
     where u.FriendsWithId == 1 
       && u.UserId != 1 
     select u.Fname 
     ).Distinct(); 
Смежные вопросы