Linq to Entities Count子查询

时间:2013-11-08 21:42:51

标签: c# sql-server linq-to-entities

好的,所以我有一堆用户可以评分的地方(给出一个分数)。在提取地点时,我也想知道有多少朋友评价该地方。用户通过发送请求成为朋友。

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()
                 })

这是我的朋友系统模型,使这个查询有点笨重吗?任何人都有任何可以批准的提示,使它更有效率,易于阅读?

1 个答案:

答案 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个月内更改架构,会发生什么?

相关问题