0

我正在尝试根据用户是否以 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)
    )
4

1 回答 1

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);
于 2013-09-03T07:17:57.810 回答