0

さて、ユーザーが評価できる (スコアを付ける) 場所がたくさんあります。場所を取得するとき、その場所を評価した友人の数も知りたいです。ユーザーはリクエストを送信することで友達になります。

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

このクエリを少しかさばらせるのは、私のフレンド システム モデルですか? より効率的で読みやすくするために行うことができる承認のヒントはありますか?

4

1 に答える 1

0

1 つの質問 - クエリごとにフレンドを再計算するのはなぜですか? 友達を見つけて、それらへの参照を User オブジェクトに入れることができます。それははるかに簡単です

var friendPlaces = users.Friends.Reviews.Where(r => r.PlaceId == placeID);

またはさらに良い

var friendPlace= users.Friends.Select(GetPlacesReviewed).Where(p => p.Id == placeID);

アプリケーションのすべての部分が基本的な DB 構造を認識している必要はありません。2 か月でスキーマを変更する必要がある場合はどうなりますか?

于 2013-11-08T22:22:46.183 に答える