C# linq left join仅包含匹配值的问题
我有以下代码C# linq left join仅包含匹配值的问题,c#,linq,entity-framework,C#,Linq,Entity Framework,我有以下代码 public async Task<List<UserBasicViewModel>> FindUsersWithFriendshipStatusAsync( Guid userId, string searchValue, int skip, int take) { var db = DbMakeLocalInstance; var userQue
public async Task<List<UserBasicViewModel>> FindUsersWithFriendshipStatusAsync(
Guid userId,
string searchValue,
int skip,
int take)
{
var db = DbMakeLocalInstance;
var userQuery =
from user in db.Users
where (user.FirstName.StartsWith(searchValue)
|| user.LastName.StartsWith(searchValue)
|| user.Name.StartsWith(searchValue)
|| user.School.StartsWith(searchValue)
|| user.SchoolClass.StartsWith(searchValue))
&& user.UserId != userId
join status in db.Friendship on user.UserId equals status.FriendUserId into fstatus
from status in fstatus.DefaultIfEmpty()
where status.UserId == userId
select new {User = user, Status = status};
var query2 = await (userQuery.OrderBy(u => u.User.Name)
.Skip(skip)
.Take(take)
.ToListAsync()
.ConfigureAwait(continueOnCapturedContext: false));
var users = query2.Select(u => new UserBasicViewModel(u.User, u.Status)).ToList();
return users;
}
public async Task FindUsersWithFriendshipStatusAsync(
Guid用户ID,
字符串搜索值,
int skip,
整数(取整数)
{
var db=DbMakeLocalInstance;
var userQuery=
来自db.Users中的用户
其中(user.FirstName.StartsWith(searchValue)
||user.LastName.StartsWith(searchValue)
||user.Name.StartsWith(searchValue)
||user.School.StartsWith(searchValue)
||user.SchoolClass.StartsWith(searchValue))
&&user.UserId!=UserId
将user.UserId上的db.friendy的状态等于status.FriendUserId加入fstatus
来自fstatus.DefaultIfEmpty()中的状态
其中status.UserId==UserId
选择新建{User=User,Status=Status};
var query2=await(userQuery.OrderBy(u=>u.User.Name)
.Skip(Skip)
.拿(拿)
.ToListAsync()
.ConfigureAwait(continueOnCapturedContext:false));
var users=query2.Select(u=>newuserbasicviewmodel(u.User,u.Status)).ToList();
返回用户;
}
它应该为我提供与搜索查询和友谊状态匹配的所有用户(如果它与提供的用户ID
存在)
问题在于,它只返回当前userId
与搜索查询中匹配的用户之间已经存在关系的用户。我希望用户匹配的搜索查询没有任何匹配的友谊以及
请帮忙 您可以在左加入之前检查status.UserId和UserId之间的相等性
from user in db.Users
where (user.FirstName.StartsWith(searchValue)
|| user.LastName.StartsWith(searchValue)
|| user.Name.StartsWith(searchValue)
|| user.School.StartsWith(searchValue)
|| user.SchoolClass.StartsWith(searchValue))
&& user.UserId != userId
join status in db.Friendship on new {user.UserId, searchUserId = userId} equals
new {UserId = status.FriendUserId, searchUserId = status.UserId} into fstatus
from status in fstatus.DefaultIfEmpty()
select new {User = user, Status = status};
你可以试试:
var userQuery =
from user in db.Users
where (user.FirstName.StartsWith(searchValue)
|| user.LastName.StartsWith(searchValue)
|| user.Name.StartsWith(searchValue)
|| user.School.StartsWith(searchValue)
|| user.SchoolClass.StartsWith(searchValue))
&& user.UserId != userId
select new {
User = user,
// I'm using single because I'm guessing there's only one match
Status = db.Friendship
.Where(f => f.FriendUserId == user.UserId && f.UserId == userId)
.SingleOrDefault(),
};
你不能让
where status.UserId==UserId
SingleOrDefault()
使它崩溃,所以必须将它更改为FirstOrDefault()
,但在其他方面是完美的!非常感谢你!