2013-09-03 3 views
0

Я пытаюсь вернуть набор записей, основанный на том, что пользователь связан с одним или несколькими способами в LINQ, и у меня много проблем с этим.Присоединиться к нескольким опциям

В принципе, мне нужно показать всех пользователей, которые существуют внутри одного здания, корпоративного или они являются тентом в здании.

Это также будет отфильтровано по массиву идентификаторов здания. В моем примере я жестко кодирую массив массивов (2, 4, 6), но это должно быть в какой-то форме .Contains()

Я написал запрос, который мне нужен в стандартном SQL, и он отлично работает. У меня проблемы с преобразованием в LINQ.

Может ли кто-нибудь объяснить лучший способ сделать что-то подобное в linq, или предложить способ, которым я могу преобразовать стандартный SQL в сущности?

SELECT 
    * 
FROM 
    UserProfile UP 
WHERE 
    EXISTS(
    SELECT 
     BodyCorporateMemberID 
    FROM 
     BodyCorporateMembers BCM 
    WHERE 
     UP.UserId = BCM.UserId AND BCM.BuildingId IN (2, 4, 6) 
    ) 
    OR 
    EXISTS(
    SELECT 
     UR.UserRoomId 
    FROM 
     UserRoom UR 
     INNER JOIN Rooms R ON UR.RoomId = R.RoomId 
     INNER JOIN Floors F ON R.FloorId = F.FloorId 
    WHERE 
     UR.UserId = UP.UserId AND F.BuildingId IN (2, 4, 6) 
    ) 
+0

У вас уже есть модель в EF? Не могли бы вы показать его? –

ответ

0

Хорошо мне удалось это исправить, и это было не так сложно, как я думал, что, хотя я боролся с ним в течение нескольких часов. Я все еще не уверен, что это оптимальный способ сделать это, но предварительная подготовка должна быть достаточной для того, что мне нужно для

var buildings = Functions.getBodyCorporateBuildings(WebSecurity.CurrentUserId); 

var userprofilemodel = 
(from u in db.UserProfiles 
where 
(
(
    from BCM in db.BodyCorporateMembers 
    where u.UserId == BCM.UserId && buildings.Contains(BCM.BuildingId) 
    select new { HasBodyCorporate = true } 
).Any() 
|| 
(
    from UR in db.UserRoom 
    join R in db.Room on UR.RoomId equals R.RoomId 
    join F in db.Floor on R.FloorId equals F.FloorId 
    where UR.UserProfileId == u.UserId && buildings.Contains(F.BuildingId) 
    select new { HasRoom = true } 
).Any() 
) 
orderby u.FirstName, u.LastName 
select new UserListViewModel 
{ 
    UserId = u.UserId 
}).ToPagedList(page, 10); 
Смежные вопросы