私は2つのテーブルを持っています
- userfriendrequests
- ユーザーフレンド
userfriendrequestsデータのすべてを取得したいのですが、userfriends.FriendIDリストに存在するuserfriendrequests.UserIDを除外します
私のIDは1ですが、友達リクエストを取得したいと思います。
userfriendrequests-友達リクエストのリストを表示します
UserID FriendID
2 1
3 1
4 1
5 1
6 1
7 1
userfriends-友達のリストを作成する
UserID FriendID
1 22
1 23
1 33
1 55
1 2
1 3
結果は次のようになります。
userfriendrequests
UserID FriendID
4 1
5 1
6 1
7 1
では、linqで単一のクエリのみでこれを行うにはどうすればよいですか?
これは私がこれまでに試したことです:ダブルクエリの使用
List<FriendRequest> myFriendRequest = new List<FriendRequest>();
using (dbasecoreEntities dbase = Logic.Utility.dbaseContext())
{
var ufr = (from uf in dbase.userfriendrequests
where uf.FriendID == details.UserID && !uf.IsBlocked && !uf.IsIgnored && uf.UserID != details.UserID
select uf).OrderBy(i => i.RequestDate).Skip(skip).Take(take).ToList();
var myfriends = (from frnd in dbase.userfriends where frnd.UserID == details.UserID select frnd.FriendID).ToList();
ufr = ufr.Where(i => !myfriends.Any(j => j == i.UserID)).ToList();
myFriendRequest = (from userFriend in ufr
select new FriendRequest(userFriend, details.GMTTimeZone)).ToList();
}
return myFriendRequest;
単一クエリの使用。しかし、これは結果を返すのに非常に長い時間がかかります。
using (dbasecoreEntities dbase = Logic.Utility.dbaseContext())
{
var list = (from uf in dbase.userfriendrequests.Where(i => i.FriendID == details.UserID && !i.IsBlocked && !i.IsIgnored && i.UserID != details.UserID).AsEnumerable()
where !dbase.userfriends.Where(i => i.UserID == details.UserID).Any(j => j.UserID == uf.UserID)
select new FriendRequest(uf)).OrderBy(i => i.RequestDate).Skip(skip).Take(take).ToList();
return list;
}
ここではAsEnumerableを使用しているので、select new FriendRequest(uf)を直接使用できます。
DOUBLE QUERYは、10レコードの場合は7秒未満、100レコードの場合は1分以上かかります。