加入多个选项

时间:2013-09-03 06:31:34

标签: asp.net-mvc linq entity-framework

我试图根据用户是否在LINQ中以一种或多种方式与建筑物相关来返回记录集,并且我遇到了很多麻烦。

基本上,我需要向所有存在于同一建筑物内部的用户展示,或者他们是建筑物中的一部分。

这也将被建筑物ID数组过滤。在我的例子中,我硬编码构建数组(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)
    )

1 个答案:

答案 0 :(得分: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);