我试图根据用户是否在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)
)
答案 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);