好的,所以我有一堆用户可以评分的地方(给出一个分数)。在提取地点时,我也想知道有多少朋友评价该地方。用户通过发送请求成为朋友。
FRIENDREQID -- ID of user that sent the request.
FRIENDRESPID -- ID of user that got the request
STATUS -- Status of the request. (Accepted / Pending)
此查询完成了这项工作。
select
p.*,
(
select
count(*)
from
UserRatings ur,
Friends f
where
ur.PlaceId = p.PlaceId
and (ur.UserId = f.FriendReqId and f.FriendRespId = @myUserId )
or (ur.UserId = f.FriendRespId and f.FriendReqId = @myUserId )
and f.Status = 'A'
) as FriendCount
from
Places p
我真的很难在linq中与实体(我是初学者)提出相互查询并想出了这个。
var result = (from p in db.Places
select new PlaceDTO
{
PlaceId = p.PlaceId,
FriendRatingCount = (from f in db.Friends
from ur in db.UserRatings
where ur.PlaceId == p.PlaceId &&
(ur.UserId == f.FriendReqId && f.FriendRespId == argUserId) ||
(ur.UserId == f.FriendRespId && f.FriendReqId == argUserId) &&
f.Status == "A"
select f).Count()
})
这是我的朋友系统模型,使这个查询有点笨重吗?任何人都有任何可以批准的提示,使它更有效率,易于阅读?
答案 0 :(得分:0)
一个问题 - 为什么要为每个查询重新计算朋友?你可以弄清楚朋友,并在User对象中引用它们。这样做要简单得多
var friendPlaces = users.Friends.Reviews.Where(r => r.PlaceId == placeID);
甚至更好
var friendPlace= users.Friends.Select(GetPlacesReviewed).Where(p => p.Id == placeID);
比应用程序的每个部分都知道您的基本数据库结构。如果必须在2个月内更改架构,会发生什么?